Yerel satır düzenleme yapan bir SSH sarmalayıcı betiği yazdım. Ssh'ye benzer şekilde çağrılır. Örneğin: python3 sshwrapper.py [email protected] -CX
. Sorun şu ki, bu komut dosyasını kullanarak uzak bir bilgisayara bağlandığımda ve kullandığımda vim
veya tmux
orada bazı çöpler basılmış. Bu sorun Ssh'ye özgü değildir, çünkü bu komut dosyasını sarmak için kullandığımda sorunlar da ortaya çıkar bash
yerine ssh
.
Örnekler:
Başladıktan sonra
tmux
, bazı çöp bash isteminden sonra yazdırılır:abc@me:~$ ^[[?65;1;9c
Vim'de yeni bir dosya açarken
vim mynewfile.txt
, bu ilk satırda görünür:^[[2;2R^[[>65;6003;1c^[]10;rgb:0000/0000/0000^G^[]11;rgb:ffff/ffff/dddd^G
Sorunu nasıl çözerim?
Söz konusu senaryo budur:
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'\03') # 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'\04') # 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()
Hem yerel bilgisayarımda hem de uzak bilgisayarda Ubuntu 20.04'te Python 3.8.10 kullanıyorum. Bu bir kendi kendine eğitim projesidir, bu yüzden programı sadece Python standart kütüphanelerini kullanarak yazıyorum.
export LS_COLORS=none
durum üzerinde hiçbir etkisi yoktur.