Запобігти SSH клієнту пропускати змінну середовища TERM на сервер?


21

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

  • ls результат не має кольору
  • tmux, screen, hexedit, htopВсе вони не змогли почати з повідомленням про помилку , як:
    Помилка відкритого терміналу: відсутній або непридатний термінал: екран-256колор

Здається, що sshпередає змінну середовища $ TERM на сервер, але я не можу її знайти у /etc/ssh/ssh_configфайлі Fedora 18.

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

Відповіді:


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).
Люянь 刘 研

забув відзначити, я побіг tmuxв гномом-термінал з Fedora 18, tmuxзмінив $TERMзначення screen-256colorвід xterm-256color.
LiuYan 刘 研

btw, чи може ssh працює таким чином: отримайте термінфо, який хост / сервер підтримує (не заштовхується), а потім підберіть один клієнтський термінал, який може підтримувати?
LiuYan 刘 研

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'можна скоротити до infocmp | ssh root@remote-host "tic -". Це працює, тому що, коли у вас є труба, до неї можна отримати доступ до файлу, використовуючи - і на щастя, труби працюють через SSH.
Алан Дженкінс

1
@starfry, я не можу дати вам жодних гарантій того, що двійковий формат ticфайлів (створених компілятором терміна) буде однаковим для однієї системи в іншу або що їх розташування буде однаковим. ticможе також переконатися, що дозволи є правильними, або створити посередницькі каталоги, де це необхідно.
Стефан Шазелас

10

У моєму випадку я просто додав псевдонім до свого .zshrc( .bashrcякщо використовується bash) на своєму локальному робочому столі:

alias ssh='TERM=xterm ssh'

Якщо ви вже використовуєте псевдонім, відрегулюйте його, щоб включити призначення оточення.


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.


Або не запускайте підзарядку та інший процес: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.

і людина 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 під час виклику ssh (like TERM=xterm ssh ...), змінити його після входу в систему (як in .bash_profile), або визначити невідомий тип TERM на стороні сервера (якщо припустити, що ви маєте кореневий доступ туди). Детальну інформацію див. У іншій відповіді.


1
Не встановлення $TERMнасправді не буде кращим, ніж встановити його на непідтримуване значення.
Стефан Шазелас

Буквальне питання полягало в тому, як запобігти надсиланню терміна. - Відповідь: Ви не можете. - Що він повинен зробити, це встановити його на відповідне значення, так.
michas

$TERMтимчасові зміни можуть бути вирішенням, але мені потрібно робити це кожного разу. до речі, здається , що обидва CentOS 5 і Fedora 18 Accept ENV всі змінні оточення локалі ( LANG, LC_*, ...)
Liuyan刘研
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.