Предотвратить передачу клиентом SSH переменной окружения TERM на сервер?

21

В настоящее время я использую терминал Fedora 18 gnome , затем запустил tmuxмультиплексор в нем. После того, как я подключился к серверу CentOS 5 через sshкоманду, я нахожу:

  • ls результат не имеет цвета
  • tmux, screen, hexedit, htopВсе они не смогли начать с сообщением об ошибке , как:
    не удалось открыть терминал: отсутствует или не подходит терминал: screen-256color

Кажется, что sshпередает переменную среды $ TERM на сервер, но я не могу найти ее в /etc/ssh/ssh_configфайле Fedora 18.

Хотя я могу вручную изменить переменную $ TERM на сервере, при каждом подключении это происходит снова. Так как это предотвратить?

LiuYan 刘 研
источник

Ответы:

18

$TERM сказать приложениям, с каким терминалом они разговаривают, чтобы они знали, как с ним разговаривать.

Измените его на значение, поддерживаемое удаленным хостом, которое максимально соответствует вашему терминалу ( screen).

В большинстве систем Linux должна быть хотя бы screenзапись terminfo. Если нет, screenреализует расширенный набор vt100и vt100является универсальным. Так:

TERM=screen ssh host

или

TERM=vt100 ssh host

Если вам нужна поддержка 256 цветов, вы можете попробовать, xterm-256colorкоторая должна быть достаточно близкой ( screenподдерживает 256 цветов точно так же, как xtermделает это), и сообщить приложениям, что ваше терминальное приложение поддерживает 256 цветов, и рассказать им, как их использовать.

Или вы можете установить запись terminfo на удаленном хосте.

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'
Стефан Шазелас
источник
2
Полезно знать, infocmpи tic, после компиляции, не нужно временно менять $TERMснова. Кстати, я только что скопировал (rsync) /usr/share/terminfo/s/screen-256colorиз Fedora 18 в CentOS, кажется, работает нормально ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 研 研
забыл упомянуть, я бегал tmuxв gnome-терминал Fedora 18, tmuxизменил $TERMзначение screen-256colorс xterm-256color.
LiuYan 研 研
Кстати, может ли ssh работать следующим образом: получить terminfo, который поддерживает хост / сервер (не помещается в него), а затем получить тот, который может поддерживать клиентский терминал?
LiuYan 刘 研
2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'можно сократить до infocmp | ssh root@remote-host "tic -". Это работает, потому что когда у вас есть канал, к нему можно получить доступ как к файлу с помощью - и, к счастью, каналы работают через SSH.
Алан Дженкинс
1
@starfry, я не могу дать вам никакой гарантии, что двоичный формат ticсгенерированных файлов (компилятор terminfo) будет одинаковым для разных систем или их расположение будет одинаковым. ticможет также убедиться, что разрешения правильные или создать промежуточные каталоги, где это необходимо.
Стефан Шазелас
10

В моем случае я просто добавил псевдоним к своему .zshrc( .bashrcпри использовании bash) на локальном рабочем столе:

alias ssh='TERM=xterm ssh'

Если вы уже используете псевдоним, настройте его, чтобы включить назначение среды.

zaTricky
источник
1

Я положил это в моем .bashrcна удаленном хосте:

# 256-color mode not supported on this host
if echo $TERM | grep -q -- '-256color'; then
    echo -e '\n\n256-color mode not supported on this host.  Reverting TERM...\n'
    export TERM=`echo -n $TERM | sed 's/-256color//'`
fi

Таким образом, оба xterm-256colorи screen-265colorобрабатываются правильно. Кроме того, он выводит примечание, так что если сервер будет обновлен позже и будет поддерживать 256 цветов, я не буду биться головой о стену, удивляясь, почему моя переменная TERM изменяется при SSHing.

depquid
источник
Или не запускайте подоболочку и другой процесс:export TERM=${TERM%%-256color}
miken32
1

Изменение $TERMможет сработать, но я не предлагаю этого, это всего лишь обходной путь вместо решения.

Когда я сталкиваюсь с этой проблемой в своих системах, я исправляю ее, устанавливая поддержку наиболее распространенных типов терминалов в удаленной системе:

  • yum install ncurses-baseдля screen-256colorна CentOS
  • yum install ncurses-termдля screen-256color-bceна CentOS
  • apt install ncurses-baseдля обоих screen-256colorи screen-256color-bceна Debian, Ubuntu и монетный двор

Пакеты, связанные с ncurses, также поддерживают множество других терминалов, и они также доступны во всех других крупных дистрибутивах. (Но для моего варианта использования и вашего вопроса должно хватить информации)

Гаро
источник
0

Смотрите man ssh_config:

 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.

и man sshd_config:

 AcceptEnv
         Specifies what environment variables sent by the client will be
         copied into the session's environ(7).  See SendEnv in
         ssh_config(5) for how to configure the client.  Note that envi-
         ronment passing is only supported for protocol 2.  Variables are
         specified by name, which may contain the wildcard characters `*'
         and `?'.  Multiple environment variables may be separated by
         whitespace or spread across multiple AcceptEnv directives.  Be
         warned that some environment variables could be used to bypass
         restricted user environments.  For this reason, care should be
         taken in the use of this directive.  The default is not to accept
         any environment variables.

В соответствии с этим, по умолчанию не должно отправляться никаких переменных, но TERM кажется особенным. Это все равно отправлено.

Поэтому вы можете изменить TERM при вызове ssh (например TERM=xterm ssh ...), изменить его после входа в систему (например, in .bash_profile) или определить неизвестный тип TERM на стороне сервера (при условии, что у вас есть root-доступ). Смотрите другой ответ для деталей.

Михась
источник
1
Не установка $TERMне будет лучше, чем установка неподдерживаемого значения.
Стефан Шазелас
Буквальный вопрос заключался в том, как предотвратить отправку TERM. - Ответ: вы не можете. - То, что он должен сделать, это установить его на подходящее значение, да.
Михас
$TERMвременное изменение может быть обходным путем, но мне нужно делать это каждый раз. кстати, кажется , что оба CentOS 5 и Fedora 18 Accept ENV все переменные окружения локали ( LANG, LC_*, ...)
Liuyan刘研