Можно ли изменить значение $ TERM при вызове ssh?

21

На моем локальном терминале у меня TERM = konsole-256color, но не все удаленные машины, к которым я подключаюсь, имеют это определение.

Можно ли заставить ssh изменить TERM на удаленной машине? Без изменения сценариев .bash * на удаленном компьютере, просто путем изменения конфигурации на моем локальном рабочем столе?


источник

Ответы:

9

Я добавил следующий псевдоним в мой файл .bashrc. Он использует ответ OG, но заключает его в псевдоним. Работает как шарм;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'
Johan
источник
Это работает, если я использую ssh из терминала. Но у меня также есть несколько скриптов, которые запускают ssh, и псевдоним для них не раскрывается. Есть ли способ избежать отдельного псевдонима для каждого из них?
Тейн
Если вашему сценарию требуется конкретное значение TERM, я думаю, что было бы лучше просто установить его в самом сценарии. Или это не вариант?
Йохан
Это не совсем вариант. Кроме того, эти сценарии выбирают сервер на основе некоторых параметров и открывают сеанс ssh для этого сервера (или, возможно, серверов в сеансе tmux), сами сценарии не зависят от значения TERM.
Тейн
В этом случае вы можете включить свой профиль bash или отдельный сценарий псевдонимов в сценарий с помощью: shopt -s expand_aliases; источник ~ / .bash_aliases
Йохан
7
TERM=vt100 ssh some.host.name

На удаленном компьютере выполните команду echo $ TERM .

О.Г.
источник
Я хотя и об этом, но я хочу, чтобы он был установлен только для подмножества хостов, к которым я ssh, поэтому выдача TERM = ... ssh все время не будет работать. и помнить, какие хосты имеют старую информацию termcap, а затем менять команду на лету тоже нехорошо.
Конфигурация для каждого хоста поддерживается только в / etc / ssh / ssh_config, однако я не знаю значения конфигурации для поддержки сопоставления схемы терминала для каждого хоста.
OG
Это также можно сделать в ~ / .ssh / config, который я знаю, но я также не могу найти никакой опции для изменения среды, отправленной на удаленный сервер. Надеялся, что я что-то упустил.
7

man ssh:

     ssh reads ~/.ssh/environment, and adds lines of the format
     “VARNAME=value” to the environment if the file exists and users are
     allowed to change their environment.  For more information, see the
     PermitUserEnvironment option in sshd_config(5).

Редактировать:

Крысы, я надеялся, что это может быть на местной стороне, все же, если есть желание, есть способ. man ssh_conf:

SendEnv
             Specifies what variables from the local environ(7) should be sent
             to the server.  Note that environment passing is only supported
             for protocol 2.  The server must also support it, and the server
             must be configured to accept these environment variables.  Refer
             to AcceptEnv in sshd_config(5) for how to configure the server.
             Variables are specified by name, which may contain wildcard char-
             acters.  Multiple environment variables may be separated by
             whitespace or spread across multiple SendEnv directives.  The
             default is not to send any environment variables.

В зависимости от конфигурации sshd на принимающей стороне это может или не может выполнить требование «без удаленной модификации файла».

Павел Бродацкий
источник
1
Да, но это конфигурация на удаленной стороне, и мне нужно / нужно что-то, что изменяется только на локальном конце.
4
SendEnv не связан. Это может возможно отправить дополнительные переменные ENV, но: 1. он не может изменить их, и 2. TERM отправляется в любом случае, даже если он не указан в SendEnv.
5

Вот мое быстрое и грязное решение, которое я только что бросил вместе. Я бы предпочел что-то лучшее. Я думаю, что я мог бы использовать вместо этого сценарий оболочки. Корректировка TERMзначений оставлена ​​читателю в качестве упражнения.

# To move into a separate plugin...
function ssh {
   if [[ "${TERM}" = screen* || konsole* ]]; then
     env TERM=screen ssh "$@"
   else
     ssh "$@"
   fi
}

В идеале, это будет что-то вроде проверки TERM на другой стороне, используя эти ControlPersistвещи для предотвращения длительных задержек для нескольких соединений.

docwhat
источник
Благодарность! Я сделал что-то подобное, но вместо того, чтобы проверять конкретные значения $TERMс помощью конструкции if/ else, я использую, $(echo -n "$TERM" | sed -e s/tmux/screen/)чтобы безоговорочно заменить проблемный «tmux» в моем локальном термине на более общепринятый тип «screen» ( источник здесь ).
Wincent