ssh backspace не работает, пока я вручную не выполню TERM=xterm

Решение Python с более гибкими аргументами командной строки:

#!/usr/bin/env python3
import sys, fileinput

def replace_after(haystack, needle, replacement):
    pos = haystack.find(needle)
    if pos >= 0:
        pos += len(needle)
        return haystack[:pos] + (replacement * (len(haystack) - pos))
    else:
        return haystack

if __name__ == '__main__':
    needle, replacement = sys.argv[1:3]
    del sys.argv[1:3]

    with fileinput.input() as finput:
        for line in finput:
            print(replace_after(line.rstrip('\n'), needle, replacement))

Использование:

python3 unix.se.346510.py <NEEDLE> <REPLACEMENT> [FILES...]

Пример:

$ printf '%s\n' 'Word: foo' 'more Word: bar-baz' | python3 unix.se.346510.py 'Word: ' '*'
Word: ***
more Word: *******
3
13.03.2017, 17:36
1 ответ

Похоже на взаимодействие readline/терминала, начните с проверки переменных среды .inputrc, /etc/inputrc, /etc/default/login, INPUTRCво время процесса входа в систему, а затем привязок readline (черезbind -q backward-delete-char).

Не повредит двойная проверка того, что находится в директивах client (ssh _config)SendEnvи server (sshd _config AcceptEnv), если что-то (хотя TERMне отправляется от клиента к серверу таким образом в OpenSSH клиент всегда включает значение TERMв настройку сеанса, а сервер устанавливает TERMиз этого ). Случайное присутствие TERMINFOили TERMCAPв окружающей среде — единственное, что я могу придумать, чтобы объяснить прерывистый характер этого.

Readline применяет "rubout" ко всему, что терминал объявляет своим "erase", а rubout - это то, что readline вызывает через backward-delete-char.

TERM— одна из специальных переменных, которые bash отслеживает, когда она установлена ​​(независимо от того, изменяется ли)bash сбрасывает терминал:

/* What to do just after one of the TERMxxx variables has changed.
   If we are an interactive shell, then try to reset the terminal
   information in readline. */
void
sv_terminal (name)
     char *name;
{
  if (interactive_shell && no_line_editing == 0)
    rl_reset_terminal (get_string_value ("TERM"));
}

(, где "TERMxxx" означает TERM, TERMCAPи TERMINFO), поэтому это объясняет, почему простая установка TERMна его текущее значение фактически выполняет действие.

Если вы не можете отследить его, добавление «TERM=${TERM}» в конце вашего .profile/ .bashrcможет помочь -.

В крайнем случае вы также можете попробовать некоторые судебные меры, как подробно описано в моем ответе здесь.:Отслеживать и предупреждать пользователя при изменении настроек stty?

0
27.01.2020, 21:38

Теги

Похожие вопросы