He escrito un SSH contenedor de secuencia de comandos que hace de local en la línea de edición. Se invoca de manera similar a SSH. Por ejemplo: python3 sshwrapper.py [email protected] -CX
. El problema es que cuando me conecto a un equipo remoto mediante esta secuencia de comandos y el uso de vim
o tmux
allí, algunos de basura se imprime. Este problema no es específico de SSH, ya que los problemas también aparecen al utilizar esta secuencia de comandos para envolver bash
en lugar de ssh
.
Ejemplos:
Después de iniciar
tmux
, algunas de basura se imprime después de que el indicador bash:abc@me:~$ ^[[?65;1;9c
Al abrir un archivo nuevo en el uso de Vim
vim mynewfile.txt
este aparece en la primera línea:^[[2;2R^[[>65;6003;1c^[]10;rgb:0000/0000/0000^G^[]11;rgb:ffff/ffff/dddd^G
¿Cómo puedo solucionar el problema?
Este es el script en cuestión:
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()
Estoy usando Python 3.8.10 en Ubuntu 20.04 tanto en mi equipo local y el equipo remoto. Este es un proyecto de educación, por lo que estoy escribiendo el programa en Python bibliotecas estándar solamente.
export LS_COLORS=none
no tiene ningún efecto sobre la situación.