为什么tmux和vim在我的SSH包装脚本中打印垃圾



我已经编写了一个SSH包装脚本,用于进行本地行编辑。它的调用方式与SSH类似。例如:python3 sshwrapper.py user@example.com -CX。问题是,当我使用此脚本连接到远程计算机并在那里使用vimtmux时,会打印一些垃圾。这个问题并不是SSH特有的,因为当我使用这个脚本包装bash而不是ssh时,问题也会出现。

示例:

  • 启动tmux后,bash提示后会打印一些垃圾:

    abc@me:~$ ^[[?65;1;9c

  • 当使用vim mynewfile.txt在Vim中打开新文件时,这会出现在第一行:

    ^[[2;2R^[[>65;6003;1c^[]10;rgb:0000/0000/0000^G^[]11;rgb:ffff/ffff/dddd^G

如何解决问题?

这是有问题的脚本:

import os
import pty
import select
import signal
import subprocess
import sys
master_fd, slave_fd = pty.openpty()
process = subprocess.Popen(['ssh'] + sys.argv[1:],
stdin=slave_fd,
stdout=slave_fd,
stderr=subprocess.STDOUT,
# Important for Ctrl-c in the remote terminal.
preexec_fn=os.setsid)
def sigint_handler(_signum, _frame):
os.write(master_fd, b'3')  # Send Ctrl-c.
signal.signal(signal.SIGINT, sigint_handler)
def sigtstp_handler(_signum, _frame):
os.write(master_fd, b'x1A')  # Send Ctrl-z.
signal.signal(signal.SIGTSTP, sigtstp_handler)
def sigchld_handler(_signum, _frame):
process.wait()
sys.exit(process.returncode)
signal.signal(signal.SIGCHLD, sigchld_handler)
while process.poll() is None:
# Block until there is something to read or write.
r, w, e = select.select([sys.stdin, master_fd], [], [])
if sys.stdin in r:
# Write to SSH.
user_input = os.read(sys.stdin.fileno(), 4096)
if not user_input:
os.write(master_fd, b'4')  # Send Ctrl-d.
else:
os.write(master_fd, user_input)
if master_fd in r:
# Read from SSH.
data = os.read(master_fd, 4096)
sys.stdout.write(data.decode())
sys.stdout.flush()

我在本地计算机和远程计算机上都使用Ubuntu 20.04上的Python 3.8.10。这是一个自学项目,所以我只使用Python标准库编写程序。

你可以尝试一个糟糕的破解方法。ssh进入机器后,尝试删除env变量LS_COLORS

export LS_COLORS=none

这种变化将持续到您的会话中。

在您的bashrc:中

alias tmux="TERM=screen-256color-bce tmux"

在.tmux.conf:中

set -g default-terminal "xterm-256color"

尝试从不同的终端应用程序运行脚本(最好设置为默认值(,看看是否仍然存在问题。

最新更新