Verhindern, dass der SSH-Client die TERM-Umgebungsvariable an den Server weitergibt?

20

Ich benutze derzeit Fedora 18 Gnome-Terminal , dann tmuxMultiplexer darin gestartet . Nachdem ich über einen Befehl eine Verbindung zu einem CentOS 5-Server hergestellt habe ssh, finde ich Folgendes:

  • ls Ergebnis hat keine Farbe
  • tmux, screen, hexedit, htopAlle beginnen mit Fehlermeldung fehlgeschlagen wie:
    offenes Terminal fehlgeschlagen: fehlendes oder ungeeignetes Terminal: screen-256color

Es scheint, dass sshdie Umgebungsvariable $ TERM an den Server übergeben wird, aber ich kann sie in der /etc/ssh/ssh_configDatei von Fedora 18 nicht finden .

Obwohl ich die Variable $ TERM auf dem Server manuell ändern kann, geschieht dies jedes Mal, wenn ich eine Verbindung herstelle. Wie kann man das verhindern?

LiuYan 刘 刘
quelle

Antworten:

17

$TERM besteht darin, Anwendungen mitzuteilen, mit welchem ​​Terminal sie sprechen, damit sie wissen, wie sie mit dem Terminal sprechen sollen.

Ändern Sie den Wert in einen Wert, der vom Remote-Host unterstützt wird und so genau wie möglich mit Ihrem Terminal ( screen) übereinstimmt .

Die meisten Linux-Systeme sollten mindestens einen screenTerminfo-Eintrag haben. Wenn nicht, screenimplementiert eine Obermenge von vt100und vt100ist universell. So:

TERM=screen ssh host

oder

TERM=vt100 ssh host

Wenn Sie die 256-Farben-Unterstützung benötigen, können Sie versuchen, xterm-256colorwelche nah genug ist ( screenunterstützt 256 Farben auf die gleiche Weise xterm), und Anwendungen mitteilen, dass Ihre Terminal-Anwendung 256 Farben unterstützt, und ihnen mitteilen, wie sie verwendet werden sollen.

Oder Sie können den Eintrag terminfo auf dem Remote-Host installieren.

infocmp -x | ssh -t root@remote-host '
  cat > "$TERM.info" && tic -x "$TERM.info"'
Stéphane Chazelas
quelle
2
Gut zu wissen infocmpund ticnach der Kompilierung keine vorübergehende Änderung $TERMmehr erforderlich . Übrigens, ich habe gerade (rsync) /usr/share/terminfo/s/screen-256colorvon Fedora 18 nach CentOS kopiert , es scheint in Ordnung zu sein ( rsync -tv /usr/share/terminfo/s/screen-256color root@the_host:/usr/share/terminfo/s).
LiuYan 刘 研
vergessen zu erwähnen, lief ich tmuxim gnome-terminal von fedora 18, tmuxänderte den $TERMwert auf screen-256colorvon xterm-256color.
LiuYan 刘 研
Übrigens, kann ssh folgendermaßen funktionieren: Holen Sie sich das Terminfo, das von Host / Server unterstützt wird (und nicht in das es gepusht wird), und holen Sie sich dann eines, das das Client-Terminal unterstützen kann.
LiuYan 刘 研
2
infocmp | ssh -t root@remote-host 'cat > "$TERM.info" && tic "$TERM.info"'kann auf gekürzt werden infocmp | ssh root@remote-host "tic -". Dies funktioniert, weil auf eine Pipe mit - als Datei zugegriffen werden kann und glücklicherweise Pipes über SSH funktionieren.
Alan Jenkins
1
@starfry, ich kann nicht garantieren, dass das Binärformat der tic(terminfo compiler) generierten Dateien von einem System zum nächsten identisch ist oder dass ihr Speicherort identisch ist. ticStellen Sie möglicherweise auch sicher, dass die Berechtigungen korrekt sind, oder erstellen Sie bei Bedarf Zwischenverzeichnisse.
Stéphane Chazelas
9

In meinem Fall habe ich meinem Alias .zshrc( .bashrcwenn ich Bash verwende) auf meinem lokalen Desktop einfach einen Alias ​​hinzugefügt :

alias ssh='TERM=xterm ssh'

Wenn Sie bereits einen Alias ​​verwenden, passen Sie ihn an, um die Umgebungszuweisung einzuschließen.

zaTricky
quelle
1

Ich habe dies in meinem .bashrcauf dem Remote-Host:

# 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

Auf diese Weise werden beide xterm-256colorund screen-265colorrichtig gehandhabt. Außerdem muss ich den Hinweis ausgeben, damit ich mich nicht wundere, warum meine TERM-Variable beim SSHing geändert wird, wenn der Server später aktualisiert wird und 256 Farben unterstützt.

depquid
quelle
Oder starten Sie keine Subshell und keinen anderen Prozess:export TERM=${TERM%%-256color}
miken32
1

Das Ändern $TERMkönnte funktionieren, aber ich schlage dies nicht vor, es ist nur eine Problemumgehung anstelle einer Lösung.

Wenn ich auf meinen Systemen auf dieses Problem stoße, behebe ich es, indem ich die Unterstützung für die gängigsten Terminaltypen auf dem Remote-System installiere:

  • yum install ncurses-basefür screen-256colorauf CentOS
  • yum install ncurses-termfür screen-256color-bceauf CentOS
  • apt install ncurses-basefür beide screen-256colorund screen-256color-bcefür Debian, Ubuntu und Mint

Die Pakete für ncurses bieten auch Unterstützung für viele andere Terminals und sind auch für alle anderen großen Distributionen verfügbar. (Aber für meinen Anwendungsfall und Ihre Frage sollte dies genug Information sein)

Garo
quelle
0

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

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

Demnach sollte der Standardwert nicht darin bestehen, Variablen zu senden, aber TERM scheint etwas Besonderes zu sein. Es wird trotzdem gesendet.

Daher können Sie entweder TERM ändern, wenn Sie ssh aufrufen (wie TERM=xterm ssh ...), oder es nach der Anmeldung ändern (wie in .bash_profile), oder den unbekannten TERM-Typ auf der Serverseite definieren (vorausgesetzt, Sie haben dort Root-Zugriff). Siehe andere Antwort für Details.

michas
quelle
1
Eine Nichteinstellung ist $TERMjedoch nicht besser als eine Einstellung auf einen nicht unterstützten Wert.
Stéphane Chazelas
Die eigentliche Frage war, wie das Senden von TERM verhindert werden kann. - Antwort: Das kannst du nicht. - Was er tun sollte, ist es auf einen geeigneten Wert zu setzen, ja.
Michas
Eine $TERMvorübergehende Änderung kann eine Problemumgehung sein, aber ich muss es jedes Mal tun. durch die Art und Weise, so scheint es , dass beiden CentOS 5 und Fedora 18 Akzeptieren Env alle Umgebungsvariablen locale ( LANG, LC_*, ...)
Liuyan刘研