Чи можна змінити значення $ TERM під час виклику ssh?


21

У своєму локальному терміналі у мене є TERM = konsole-256color, але не всі віддалені машини, які я підключаю, мають це визначення.

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

Відповіді:


9

Я додав наступний псевдонім у мій файл .bashrc. Він використовує відповідь OG, але обертає його псевдонімом. Працює як шарм;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'

Це працює, якщо я використовую ssh з терміналу. Але у мене також є кілька скриптів, які виконують ssh, і псевдонім для них не розширений. Чи я можу уникнути створення окремого псевдоніма для кожного з них?
Thayne

Якщо вашому сценарію потрібне певне значення TERM, я вважаю, що було б краще просто встановити цю змінну в самому сценарії. Або це не варіант?
Йоган

Це насправді не варіант. Крім того, ці скрипти вибирають сервер на основі деяких параметрів і відкривають ssh-сеанс для цього сервера (або, можливо, серверів під час сеансу tmux), самі сценарії не залежать від значення TERM.
Thayne

У цьому випадку ви можете включити ваш скрипт bash або окремий сценарій псевдонімів у сценарій із: shopt -s expand_aliases; джерело ~ / .bash_aliases
Йоган

7
TERM=vt100 ssh some.host.name

На віддаленому рівні виконайте echo $ TERM .


Я хоч і про це, але хочу, щоб він встановлений лише для підмножини хостів, на яку я ssh, тому видача TERM = ... ssh весь час не працюватиме. і пам’ятати, які хости мають стару інформацію про термін cap, а потім також змінювати команду на льоту.

Конфігурація на хост підтримується лише в / 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
}

В ідеалі це може зробити щось на кшталт перевірки термінів з іншого боку, використовуючи ControlPersistматеріал, щоб запобігти довгим затримкам для декількох з'єднань.


Спасибі! Я робив щось подібне, але замість перевірки конкретних значень $TERMз if/ elseконструктом я використовую, $(echo -n "$TERM" | sed -e s/tmux/screen/)щоб беззастережно замінити проблемний "tmux" в моєму локальному терміні на більш загальновизнаний тип "екрану" ( джерело тут ).
Вінсент
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.