Czy można zmienić wartość $ TERM podczas wywoływania ssh?


21

Na moim lokalnym terminalu mam TERM = konsole-256color, ale nie wszystkie zdalne komputery, do których się podłączam, mają tę definicję.

Czy jest możliwe, aby ssh zmienił TERM na zdalnym komputerze? Bez zmiany skryptów .bash * na zdalnym komputerze, wystarczy zmienić konfigurację na moim lokalnym pulpicie?

Odpowiedzi:


9

Dodałem następujący alias do mojego pliku .bashrc. Używa odpowiedzi OG, ale otacza ją aliasem. Działa jak marzenie ;)

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

Działa to, jeśli używam ssh z terminala. Ale mam też kilka skryptów uruchamiających ssh i alias nie jest dla nich rozwinięty. Czy jest jakiś sposób na uniknięcie tworzenia osobnego aliasu dla każdego z nich?
Thayne,

Jeśli twój skrypt potrzebuje określonej wartości TERM, myślę, że najlepiej byłoby ustawić zmienną w samym skrypcie. Czy to nie jest opcja?
Johan

To nie jest tak naprawdę opcja. Ponadto skrypty te wybierają serwer na podstawie niektórych parametrów i otwierają sesję ssh na tym serwerze (lub ewentualnie serwerach w sesji tmux), same skrypty nie zależą od wartości TERM.
Thayne

W takim przypadku możesz dołączyć do skryptu swój profil bash lub osobny skrypt aliasów za pomocą: shopt -s expand_aliases; źródło ~ / .bash_aliases
Johan

7
TERM=vt100 ssh some.host.name

Na pilocie uruchom echo $ TERM .


Myślałem o tym, ale chcę, aby był ustawiony tylko dla podzbioru hostów, którym ssh, więc wydawanie TERM = ... ssh przez cały czas nie będzie działać. i zapamiętywanie, którzy gospodarze mają stare informacje o termcapie, a następnie zmiana polecenia w locie również nie jest przyjemna.

Konfiguracja dla jednego hosta jest obsługiwana tylko w / etc / ssh / ssh_config, jednak nie znam żadnej wartości konfiguracyjnej do obsługi mapowania schematu terminala dla hosta.
OG

Można to również zrobić w ~ / .ssh / config, który znam, ale nie mogę również znaleźć żadnej opcji modyfikacji środowiska wysłanego na zdalny serwer. Miałem nadzieję, że coś przeoczyłem.

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).

Edytować:

Szczury, miałem nadzieję, że może to być strona lokalna, ale jeśli jest wola, istnieje sposób. 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.

W zależności od konfiguracji sshd po stronie odbierającej może to, ale nie musi, spełniać warunek „braku zdalnej modyfikacji pliku”.


1
Tak, ale jest to konfiguracja zdalna i potrzebuję / chcę czegoś, co zmienia się tylko na lokalnym końcu.

4
SendEnv nie jest powiązany. Można go ewentualnie wysłać dodatkowe zmienne env, ale: 1. nie można ich modyfikować i 2. TERM jest wysyłany w każdym razie, nawet jeśli nie jest wymieniony w SendEnv.

5

Oto moje szybkie i brudne rozwiązanie, które właśnie rzuciłem. Wolałbym coś lepszego. Chyba mógłbym zamiast tego użyć skryptu powłoki. Dostosowywanie TERMwartości pozostawia się czytelnikowi jako ćwiczenie.

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

Idealnie byłoby zrobić coś takiego jak sprawdzenie TERM po drugiej stronie, używając ControlPersistrzeczy, aby uniknąć długich opóźnień dla wielu połączeń.


Dzięki! Zrobiłem coś takiego, ale zamiast sprawdzania określonych wartości $TERMza pomocą if/ elsekonstrukcji, używam $(echo -n "$TERM" | sed -e s/tmux/screen/)bezwarunkowego zastąpienia problematycznego „tmux” w moim lokalnym znaczeniu bardziej powszechnie akceptowanym typem „screen” ( źródło tutaj ).
Wincent
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.