Zapobiegać przekazywaniu przez klienta SSH zmiennej środowiskowej TERM na serwer?


21

Obecnie używam terminala gnome Fedory 18 , a następnie uruchomiłem w nim multiplekser. Po połączeniu się z serwerem CentOS 5 za pomocą polecenia znajduję:tmuxssh

  • ls wynik nie ma koloru
  • tmux, screen, hexedit, htopWszystko powiodło się z komunikatem o błędzie, takich jak:
    awaria otwartego terminalu: brakujący lub nieodpowiedni terminal: screen-256color

Wygląda na to, że sshprzekazuje zmienną środowiskową $ TERM na serwer, ale nie mogę jej znaleźć w /etc/ssh/ssh_configpliku Fedory 18.

Chociaż mogę ręcznie zmienić zmienną $ TERM na serwerze, za każdym razem, gdy się łączę, dzieje się to ponownie. Jak więc temu zapobiec?

Odpowiedzi:


18

$TERM jest poinformowanie aplikacji, z którym terminalem rozmawiają, aby wiedzieli, jak z tym porozmawiać.

Zmień ją na wartość obsługiwaną przez zdalny host, która jest możliwie jak najbliższa twojemu terminalowi ( screen).

Większość systemów Linux powinna mieć przynajmniej screenwpis terminfo. Jeśli nie, screenimplementuje nadzbiór vt100i vt100jest uniwersalny. Więc:

TERM=screen ssh host

lub

TERM=vt100 ssh host

Jeśli potrzebujesz obsługi 256 kolorów, możesz wypróbować, xterm-256colorktóra powinna być wystarczająco blisko ( screenobsługuje 256 kolorów w ten sam sposób xterm) i poinformować aplikacje, że Twoja aplikacja terminalowa obsługuje 256 kolorów i powiedzieć im, jak ich używać.

Lub możesz zainstalować wpis terminfo na zdalnym hoście.

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'

2
dobrze wiedzieć infocmpi ticpo skompilowaniu nie ma potrzeby tymczasowej zmiany $TERM. przy okazji, właśnie skopiowałem (rsync) /usr/share/terminfo/s/screen-256colorz Fedory 18 do CentOS, wydaje się, że działa dobrze ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 研 研

zapomniałem wspomnieć, uruchomiłem tmuxgnome-terminal Fedory 18, tmuxzmieniłem $TERMwartość na screen-256colorz xterm-256color.
LiuYan 研 研

btw, czy ssh działa w ten sposób: pobrać terminfo, który host / serwer jest obsługiwany (nie jest wypychany), a następnie pobrać taki, który terminal klienta może obsługiwać?
LiuYan 研 研

2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'można skrócić do infocmp | ssh root@remote-host "tic -". Działa to, ponieważ gdy masz potok, można uzyskać do niego dostęp jako plik za pomocą - i na szczęście potoki działają w SSH.
Alan Jenkins

1
@ starfry, nie mogę dać żadnej gwarancji, że format binarny ticplików generowanych (kompilator terminfo) będzie taki sam z jednego systemu do drugiego lub że ich lokalizacja będzie taka sama. ticmoże również upewnić się, że uprawnienia są prawidłowe lub utworzyć katalogi pośredniczące, jeśli to konieczne.
Stéphane Chazelas,

10

W moim przypadku po prostu dodałem alias do mojego .zshrc( .bashrcjeśli używasz bash) na moim lokalnym pulpicie:

alias ssh='TERM=xterm ssh'

Jeśli już używasz aliasu, dostosuj go, aby uwzględnić przypisanie Środowisko.


1

Umieszczam to w moim .bashrcna zdalnym hoście:

# 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

W ten sposób, zarówno xterm-256colori screen-265colorsą obsługiwane prawidłowo. Mam też komunikat wyjściowy, aby jeśli serwer został później zaktualizowany i obsługiwał 256 kolorów, nie uderzam głową o ścianę, zastanawiając się, dlaczego zmienna TERM ulega zmianie podczas SSHing.


Lub nie uruchamiaj podpowłoki i innego procesu:export TERM=${TERM%%-256color}
miken32

1

Zmiana $TERMmoże działać, ale nie sugeruję tego, jest to tylko obejście zamiast rozwiązania.

Gdy napotykam ten problem w moich systemach, naprawiam go, instalując obsługę najpopularniejszych typów terminali w systemie zdalnym:

  • yum install ncurses-basedla screen-256colorCentOS
  • yum install ncurses-termdla screen-256color-bceCentOS
  • apt install ncurses-basedla obu screen-256colori screen-256color-bcena Debiana, Ubuntu i Mint

Pakiety związane z ncurses zapewniają także obsługę wielu innych terminali i są również dostępne we wszystkich innych dużych dystrybucjach. (Ale dla mojego przypadku użycia i twojego pytania powinno to wystarczyć)


0

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

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

Zgodnie z tym domyślnie nie powinno się wysyłać żadnych zmiennych, ale TERM wydaje się być wyjątkowy. Mimo to jest wysyłany.

Dlatego możesz albo zmienić TERM podczas wywoływania ssh (jak TERM=xterm ssh ...), zmienić go po zalogowaniu (jak w .bash_profile) lub zdefiniować nieznany typ TERM po stronie serwera (zakładając, że masz tam dostęp root). Zobacz inne odpowiedzi, aby uzyskać szczegółowe informacje.


1
Brak ustawienia $TERMnie będzie jednak lepszy niż ustawienie nieobsługiwanej wartości.
Stéphane Chazelas,

Dosłowne pytanie brzmiało: jak zapobiec wysyłaniu TERM. - Odpowiedź: Nie możesz. - To, co powinien zrobić, to ustawić odpowiednią wartość, tak.
michas,

zmiana $TERMtymczasowa może być obejściem, ale muszę to zrobić za każdym razem. nawiasem mówiąc, wydaje się, że obie CentOS 5 i Fedora 18 Zebrane ENV wszystkie zmienne środowiskowe locale ( LANG, LC_*...)
LiuYan刘研
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.