Frage Ist es möglich, den Wert von $ TERM zu ändern, wenn ssh aufgerufen wird?


Auf meinem lokalen Terminal habe ich TERM = konsole-256color, aber nicht alle Remote-Rechner, die ich verbinde, um diese Definition zu haben.

Ist es möglich, dass ssh den TERM auf dem entfernten Rechner ändert? Ohne das Ändern von .bash * -Skripten auf dem entfernten Rechner, nur indem ich die Konfiguration auf meinem lokalen Desktop ändere?


18
2017-08-17 16:37


Ursprung




Antworten:


TERM=vt100 ssh some.host.name

Führen Sie auf der Fernbedienung aus echo $ TERM.


6
2017-08-17 16:41



Ich habe zwar darüber nachgedacht, aber ich möchte, dass es nur für eine Teilmenge von Hosts gesetzt wird, an die ich mich anschließe, daher wird die Ausgabe von TERM = ... ssh die ganze Zeit nicht funktionieren. und sich daran zu erinnern, welche Hosts alte Termcap-Informationen haben, und dann den Befehl im laufenden Betrieb zu ändern, ist auch nicht gut.
Per-Host-Konfiguration wird nur in / etc / ssh / ssh_config unterstützt, aber ich kenne keinen Konfigurationswert, um Terminal-Schema-Mapping pro Host zu unterstützen. - O G
Es kann auch in ~ / .ssh / config getan werden, was ich weiß, aber ich kann auch keine Option finden, um die Umgebung zu ändern, die an den entfernten Server gesendet wird. Hatte gehofft, dass ich etwas verpasst habe.


Ich habe den folgenden Alias ​​zu meiner .bashrc Datei hinzugefügt. Es verwendet die Antwort von OG, fügt sie jedoch in einen Alias ​​ein. Klappt wunderbar ;)

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

6
2017-11-30 10:11



Das funktioniert, wenn ich ssh von einem Terminal verwende. Aber ich habe auch mehrere Skripte, die ssh ausführen, und der Alias ​​wird nicht für sie erweitert. Kann ich es irgendwie vermeiden, für jeden einen eigenen Alias ​​zu erstellen? - Thayne
Wenn Ihr Skript einen bestimmten TERM-Wert benötigt, denke ich, dass es am besten wäre, das Variabel im Skript selbst zu setzen. Oder ist das keine Option? - Johan
Das ist nicht wirklich eine Option. Außerdem wählt dieses Skript einen Server anhand einiger Parameter aus und öffnet eine SSH-Sitzung für diesen Server (oder möglicherweise Server in einer tmux-Sitzung), wobei die Skripts selbst nicht vom TERM-Wert abhängig sind. - Thayne
In diesem Fall könnten Sie Ihr Bash-Profil oder ein separates Aliase-Skript in das Skript einfügen: shopt -s expand_aliases; Quelle ~ /. Bash_aliases - Johan


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

Bearbeiten:

Ratten, ich hoffte, es könnte auf der lokalen Seite sein, trotzdem, wenn es ein Testament gibt, gibt es einen Weg. Mann 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.

Abhängig von der Konfiguration von sshd auf der Empfängerseite kann dies die Anforderung "keine Ferndateimodifikation" erfüllen oder nicht.


5
2017-08-17 16:43



Ja, aber das ist Konfiguration auf der Remote-Seite, und ich brauche / will etwas, das nur am lokalen Ende ändert.
SendEnv ist nicht verwandt. Es kann möglicherweise sende zusätzliche env-Variablen, aber: 1. sie können sie nicht ändern, und 2. TERM wird trotzdem gesendet, auch wenn sie nicht in SendEnv aufgelistet ist.


Hier ist meine schnelle und schmutzige Lösung, die ich einfach zusammengeworfen habe. Ich würde etwas Besseres bevorzugen. Ich denke, ich könnte stattdessen ein Shell-Skript verwenden. Anpassen TERM Werte werden dem Leser als Übung überlassen.

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

Idealerweise würde man so etwas wie die TERMs auf der anderen Seite überprüfen, indem man die ControlPersist um lange Verzögerungen für mehrere Verbindungen zu vermeiden.


5
2018-01-19 03:20



Vielen Dank! Ich habe so etwas gemacht, aber anstatt nach bestimmten Werten zu suchen $TERM mit einem if/else konstruieren, ich benutze $(echo -n "$TERM" | sed -e s/tmux/screen/) bedingungslos das problematische "tmux" in meinem lokalen Ausdruck durch den universell akzeptierten "Bildschirm" -Typ (Quelle hier). - wincent