Behebung des Terminaltitels nach der Remote-SSH-Protokollierung auf einem anderen Computer


18

Im Moment benutze ich einen einzeiligen Perl-Code, um die Titel meiner Terminalleisten zu ändern.

print("\e]0;@ARGV\7");

Aber jedes Mal, wenn ich auf eine andere entfernte Maschine gehe, wird der Titel vom Host geändert (was mich nicht sonderlich stört). Aber nachdem ich die Verbindung beendet habe, bleibt der geänderte Titel erhalten. Gibt es eine Möglichkeit, dies zu beheben? Im Wesentlichen möchte ich einen festen Titel für meine Terminals, wenn ich lokal arbeite.

Ich benutze hauptsächlich das xfce-Terminal und den Terminator unter CentOS oder Debian. Vielen Dank.

BEARBEITEN

Eine weitere feine Sache ist, dass ich es vorziehen würde, wenn alle Terminals den gleichen Namen haben und die Freiheit hätten, ihre Titel on-the-fly zu bearbeiten, aber der SSH-Sitzung nur untersagen würde, das zu ändern, was ich bearbeitet habe.

Antworten:


6

Ich weiß nichts über Fenstertitel, aber ich habe versucht, mein System dazu zu bringen, eine SSH-Sitzung zu beenden - eigentlich nach dem Beenden einer SSH-Sitzung. Kurzum: So funktioniert das nicht. Grundsätzlich haben Sie drei Möglichkeiten:

  1. Schreiben Sie einen Wrapper um ssh, dh ein ausführbares Shell-Skript mit dem Namen ssh, das Vorrang vor /usr/bin/sshIhrem $ PATH hat und das die Zeile exec /usr/bin/ssh $@irgendwo in der Mitte enthält. Auf diese Weise können Sie Ihre Shell vor und nach dem Ausführen der effektiven ssh-Binärdatei einige Aufgaben ausführen lassen, während Sie den Overhead auf ein Minimum beschränken.

  2. Schreiben Sie einen Patch gegen die SSH-Quellen Ihrer Wahl, um einen Bereinigungs-Hook bereitzustellen, der einen Shell-Befehl ausführt, der über die Befehlszeile oder eine Konfigurationseinstellung übergeben wird. Das wollen wir.

  3. Habe PROMPT_COMMANDdie Ausgabe von ausgewertet history. Grundsätzlich eine allgemeinere und hässlichere Herangehensweise an 1.


Im Grunde habe ich nur ein einfaches Skript geschrieben, um den aktuellen Titel zu erhalten und ihn vor der SSH-Sitzung zu speichern. Anschließend habe ich den Titel wiederhergestellt.
nye17

4
@ nye17 Kannst du dein verwendetes Lösungsskript posten?
Reg Mem

Ich habe mein Lösungsskript unten gepostet. sollte eine enge Übereinstimmung sein, was @ nye17 tat. unix.stackexchange.com/a/341277/112190
phyatt

7

Lösung: Fügen Sie einige Funktionen ~ / .bashrc hinzu, um nach den Befehlen ssh und su etwas zu tun

function title()
{
   # change the title of the current window or tab
   echo -ne "\033]0;$*\007"
}

function ssh()
{
   /usr/bin/ssh "$@"
   # revert the window title after the ssh command
   title $USER@$HOST
}

function su()
{
   /bin/su "$@"
   # revert the window title after the su command
   title $USER@$HOST
}

Hinweis: Starten Sie bash nach Änderungen an ~ / .bashrc neu

Beispiel:

# title is "user1@boxA"
ssh boxB  # auto changes title while on boxB to "user1@boxB"
exit
# title returns back to "user1@boxA" because of our title call in ssh()
su - user2 # auto changes title while switched user to user2: "user2@boxA"
exit
# title returns back to "user1@boxA" because of our title call in su()

Ich hoffe, das hilft.


etwas ungenau zu sagen, revertda du nicht nachschaust, was es vorher war ... wenn du den vorherigen Wert abgefragt und gespeichert hast tho ;-)
nhed

4

Konfigurieren Sie Ihr lokales Shell-Dotfile (z. B. $PROMPT_COMMANDin ~/.bashrc), um den Terminaltitel mithilfe desselben Mechanismus entsprechend festzulegen .

Beispielsweise:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"

1. prompt_command hat nichts mit dem Titel Ihres Terminalfensters zu tun, oder? Ich habe prompt_command eingerichtet, aber nur für die Eingabeaufforderung. 2. Ich benötige immer noch einen Mechanismus, um meine lokale Einstellung zu speichern und zu aktivieren, nachdem ich die SSH-Protokollierung beendet habe.
nye17

Der Eingabeaufforderungsbefehl gibt einfach die erforderliche Escape-Sequenz aus, damit Ihr Terminal die Titelleiste umbenennen kann. :)
Wiedereinsetzung von Monica am

Ich möchte aber auch die Freiheit, jedes Terminal, das ich möchte, umzubenennen, anstatt jeder einzelnen Sitzung den gleichen Namen zu geben. In der Praxis bearbeite ich im Grunde das Handbuch für den Terminaltitel und hoffe, dass das Terminal auch nach dem Anmelden / Abmelden über SSH einen festen Titel hat. Macht das Sinn?
Nye17

1
Geben Sie dann den gewünschten Titel in eine Variable ein und geben Sie diesen aus.
Ignacio Vazquez-Abrams

Wenn Sie diese Terminal-Escape-Sequenz verwenden, um einen NULL-Titel (z. B. export PROMPT_COMMAND="printf '\e]0;\7\n'") festzulegen, kann Ihr Terminal-Emulator den Fenstertitel nach Belieben festlegen. Wenn Sie zu einem Remote-Host sshen, der den Terminal-Titel festlegt, zeigt Ihr Terminal-Emulator diesen Titel an, und wenn Sie sich abmelden, wird wieder ein eigener Titel verwendet. Zumindest funktioniert die macOS Terminal App so.
Claymation

3

FÜGEN Sie diese Zeilen zu ~ / .bashrc hinzu

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

    ;;
*)
    ;;
esac

funktioniert gut mit Debian-basierten Linuxen


1
IT setzt den Titel aber nicht ...
Bananguin

Normalerweise funktioniert die Verwendung besser als die PROMPT_COMMANDVerwendung PS1, da Sie die Klammer nicht einschließen müssen \[ \]und einige Anführungszeichen eliminieren können.
Chris Seite

2

Eine Lösung besteht darin, die Terminalvariable vor ssh'ing auf vt100 zu ändern, z. B. run

export TERM=vt100

Dies funktioniert, weil Initialisierungsskripte normalerweise die Terminalvariable betrachten und nur den Titel ändern, wenn es sich um xterm handelt. Sie verlieren alternative Bildschirme, Farben und vielleicht einige andere ausgefallene Funktionen, die Sie vielleicht zu schätzen wissen oder nicht.

Wenn Sie das lokale Terminal als xterm beibehalten möchten, können Sie mit dem Alias ​​ssh die Terminalvariable im laufenden Betrieb ändern

alias ssh='TERM=vt100 /usr/bin/ssh'

es ändert die Art und Weise, wie Dinge angezeigt werden. Farben werden nicht angezeigt
Nr.

0

Ich habe dieses Problem behoben, indem ich es meiner PS1 in meiner .bashrc-Datei hinzugefügt habe.

\[\e]2;\u@\H:\w\a\]

Daher sieht die ganze Zeile so aus (ich habe meine PS angepasst !:

export PS1='\[\e]2;\u@\H:\w\a\]\n($LOGNAME@$HOSTNAME) \t\n[$PWD]: '

Ich hoffe das hilft anderen.


Wenn Sie diese Terminal-Escape-Sequenz verwenden, um einen NULL-Titel (z. B. export PS1='\[\033]0;\007\]\h:\W \u\$ ') festzulegen, kann Ihr Terminal-Emulator den Fenstertitel nach Belieben festlegen. Wenn Sie zu einem Remotehost sshen, der den Terminaltitel festlegt, zeigt der Terminalemulator dies an, und wenn Sie sich abmelden, wird wieder ein eigener Titel verwendet. Zumindest funktioniert die macOS Terminal App so.
Claymation

0

Andere Antworten würden bei mir nicht funktionieren, wenn ich SSH beende, haben mich aber näher gebracht. Das Hinzufügen von setw zum automatischen Umbenennen funktioniert, wenn ich die Remote-SSH-Sitzung beende, sodass es automatisch umbenannt wird und das Fenster nicht mehr verlassen muss, um zurückgesetzt zu werden. [Jan. 2018 - Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.