Dlaczego tmux i vim pisać śmieci w moim skrypty powłoki SSH?

0

Pytanie

Napisałem scenariusz-powłoki SSH, który wykonuje edycja lokalnej wiersza. Nazywa się podobnie do SSH. Na przykład: python3 sshwrapper.py [email protected] -CX. Problem w tym, że gdy łączę się z komputerem zdalnym za pomocą tego skryptu i używam vim lub tmux tam wydrukowany jakiś śmieci. Ten problem nie odnosi się konkretnie do SSH, tak jak problemy pojawiają się, kiedy używam ten skrypt do przenoszenia bash zamiast ssh.

Przykłady:

  • Po uruchomieniu tmuxniektóre śmieci jest drukowany po zgłoszeniu bash:

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

  • Po otwarciu nowego pliku Vim z pomocą vim mynewfile.txtto pojawia się w pierwszym wierszu:

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

Jak mam rozwiązać ten problem?

To ten sam scenariusz, o którym mowa:

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()

Używam Pythona 3.8.10 w Ubuntu 20.04 jak na swoim komputerze lokalnym, jak i zdalnym. Jest to projekt samokształcenia, dlatego piszę program, za pomocą tylko standardowe biblioteki Pythona.

linux pty python termios
2021-11-24 05:56:26
3
0

Jest zły hack, który można spróbować. Po ssh do samochodu spróbuj usunąć zmiennej env LS_COLORS

export LS_COLORS=none

Zmiana ta utrzyma się w twojej sesji.

2021-11-26 07:23:48

export LS_COLORS=none w żaden sposób nie wpływa na sytuację.
Flux

gettinggud

Jest to projekt samokształcenia, dlatego piszę program, za pomocą tylko standardowe biblioteki Pythona.
Flux

W tym przypadku wszystko, co mogę zaoferować, to dodać jakieś filtry, aby wyświetlić/usunąć kolorów: link link. Przy okazji, dobry projekt!
gettinggud

Co jest główną przyczyną problemu?
Flux
0

W swoim bashrc:

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

W twoim pliku .tmux.conf:

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

2021-11-30 14:19:56

Śmieci nadal jest wyświetlany jak dla tmux, jak i vim.
Flux
0

Spróbuj uruchomić skrypt z innej aplikacji terminalowej (najlepiej z domyślnymi ustawieniami) i zobacz czy masz problemy.

2021-12-03 06:15:39

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................