我已经编写了一个SSH包装脚本,用于进行本地行编辑。它的调用方式与SSH类似。例如:python3 sshwrapper.py user@example.com -CX
。问题是,当我使用此脚本连接到远程计算机并在那里使用vim
或tmux
时,会打印一些垃圾。这个问题并不是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"
尝试从不同的终端应用程序运行脚本(最好设置为默认值(,看看是否仍然存在问题。