Kann man den Wert von $ TERM ändern, wenn man ssh aufruft?

21

Auf meinem lokalen Terminal habe ich TERM = konsole-256color, aber nicht alle Remote-Computer, mit denen ich eine Verbindung herstelle, haben diese Definition.

Ist es möglich, ssh dazu zu bringen, den TERM auf dem entfernten Rechner zu ändern? Ohne die .bash * -Skripte auf dem Remote-Computer zu ändern, einfach durch Ändern der Konfiguration auf meinem lokalen Desktop?


quelle

Antworten:

9

Ich habe den folgenden Alias ​​zu meiner .bashrc-Datei hinzugefügt. Es verwendet die Antwort von OG, umschließt sie jedoch mit einem Alias. Klappt wunderbar ;)

# Force xterm-color on ssh sessions
alias ssh='TERM=xterm-color ssh'
Johan
quelle
Dies funktioniert, wenn ich ssh von einem Terminal aus verwende. Aber ich habe auch mehrere Skripte, die ssh ausführen, und der Alias ​​wird für sie nicht erweitert. Kann ich es irgendwie vermeiden, für jeden einen eigenen Alias ​​zu erstellen?
Thayne
Wenn Ihr Skript einen bestimmten TERM-Wert benötigt, ist es meines Erachtens am besten, diese Variable im Skript selbst festzulegen. Oder ist das keine Option?
Johan
Das ist eigentlich keine Option. Außerdem wählen diese Skripte einen Server basierend auf einigen Parametern aus und öffnen eine SSH-Sitzung für diesen Server (oder möglicherweise Server in einer TMUX-Sitzung). Die Skripte selbst hängen nicht vom TERM-Wert ab.
Thayne
In diesem Fall können Sie Ihr Bash-Profil oder ein separates Aliases-Skript in das Skript einbinden: shopt -s expand_aliases; source ~ / .bash_aliases
Johan
7
TERM=vt100 ssh some.host.name

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

OG
quelle
Ich denke darüber nach, aber ich möchte, dass es nur für eine Untergruppe von Hosts festgelegt wird, an die ich ssh versende. Daher funktioniert es nicht, TERM = ... ssh die ganze Zeit auszugeben. und sich zu erinnern, welche Hosts alte termcap-Informationen haben, und dann den Befehl im laufenden Betrieb zu ändern, ist auch nicht schön.
Die Konfiguration pro Host wird nur in / etc / ssh / ssh_config unterstützt. Ich kenne jedoch keinen Konfigurationswert für die Unterstützung der Zuordnung von Terminalschemata pro Host.
OG
Es kann auch in ~ / .ssh / config durchgeführt werden, was ich weiß, aber ich kann auch keine Option zum Ändern der an den Remote-Server gesendeten Umgebung finden. Habe gehofft, dass ich etwas verpasst habe.
7

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, aber wenn es einen Willen gibt, gibt es einen Weg. 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.

Abhängig von der Konfiguration von sshd auf der Empfängerseite kann dies die Anforderung "Keine entfernte Dateiänderung" erfüllen oder nicht.

Paweł Brodacki
quelle
1
Ja, aber dies ist eine Konfiguration auf der Remote-Seite, und ich benötige / möchte etwas, das sich nur auf der lokalen Seite ändert.
4
SendEnv ist nicht verwandt. Es kann möglicherweise zusätzliche Umgebungsvariablen senden, aber: 1. es kann sie nicht ändern, und 2. TERM wird trotzdem gesendet, auch wenn es nicht in SendEnv aufgeführt ist.
5

Hier ist meine schnelle und schmutzige Lösung, die ich gerade zusammengeschmissen habe. Ich würde etwas besseres vorziehen. Ich denke, ich könnte stattdessen ein Shell-Skript verwenden. Das Einstellen von TERMWerten bleibt dem Leser überlassen.

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

Im Idealfall werden die TERMs auf der anderen Seite überprüft ControlPersist, um lange Verzögerungen bei mehreren Verbindungen zu vermeiden.

docwhat
quelle
Vielen Dank! Ich habe so etwas gemacht, aber anstatt $TERMmit einem if/ -Konstrukt nach bestimmten Werten zu suchen, ersetze elseich $(echo -n "$TERM" | sed -e s/tmux/screen/)bedingungslos das problematische "tmux" in meinem lokalen Begriff durch den allgemein akzeptierten "screen" -Typ ( Quelle hier ).
1.