tmux window name in prompt_command, ps1 oder remote ssh hostname umbenennen?

25

Ich würde gerne meinen tmux Fenstertitel automatisch in prompt_command, ps1 oder nur den Hostnamen eines Rechners umbenennen lassen ssh. 9 Fenster mit der Bezeichnung "ssh" geöffnet zu haben, ist wirklich nutzlos. Während ich sysadmin arbeite, öffne ich neue Bildschirme und ssh um zu viel, um sie manuell umzubenennen.

Eine Sache, die mir aufgefallen ist, ist die tmuxAktualisierung des xtermFenstertitels, damit ich das Gefühl habe, dass er es wissen muss.

Irgendeine Hilfe? Ich wäre sogar bereit, zurückzukehren, screenwenn ich dieses Feature bekommen könnte.

user68782
quelle

Antworten:

15

Mir ist keine Möglichkeit bekannt, es PS1direkt auf dich wirken zu lassen .

Allerdings tmuxversteht die gleichen Befehle die Fensternamen zu setzen , wie der screenFall ist.

So können Sie eine Funktion wie diese in Ihrem ~/.bashrcoder definieren ~/.zshrc:

settitle() {
    printf "\033k$1\033\\"
}

und dann settitlevon überall anrufen .

Sie können es beispielsweise in Ihre PS1Variable aufnehmen, z

PS1='$HOST:$PWD$(settitle $HOST:$PWD)$ '

oder über PROMPT_COMMAND:

PROMPT_COMMAND='$(settitle $HOST:$PWD)'
# and don't change PS1

Jetzt haben Sie verstanden, dass Sie tmuxauf Ihrem Desktop ausgeführt werden, und Sie möchten, dass sshBefehle den Hostnamen haben, anstatt sshdass dies viel einfacher ist.

Vorausgesetzt, Sie haben settitlezu Ihrem lokalen hinzugefügt~/.bashrc , ist alles, was Sie tun möchten, dies auch hinzuzufügen:

ssh() {
    settitle "$*"
    command ssh "$@"
    settitle "bash"
}

Ersetzen Sie bash durch zsh oder, falls erforderlich, durch etwas passenderes.

Mikel
quelle
Dies benennt den Fenstertitel wirklich nicht mit dem Hostnamen der Remote-Box, ohne dass das .bashrc-Setup auf der Remote-Box vorhanden ist. Vielen Dank, obwohl ich etwas Geschicklichkeit gelernt habe.
User68782
Wenn alles, was Sie wollen, der Hostname auf Ihrer lokalen Seite ist, ist das viel einfacher. Warte eine Sekunde ...
Mikel
brillant! Danke dir. Tut mir leid, dass ich meine Anfrage nicht erklären konnte, was zu zwei Fragen führte. noch einmal Danke!
User68782
Da tmux seinen Fenstertitel nach Belieben ändert, kann dies sehr schnell durch normale Änderungen des Fenstertitels durch tmux überschrieben werden.
UtahJarhead
Vielen Dank! Ich habe verwendet PROMPT_COMMAND='settitle $HOSTNAME:$PWD'- da ich mit @ Mikel's Code -bash: : No such file or directoryvor jeder Eingabeaufforderung keinen Hostnamen und einen Fehler bekam . Es scheint mir, dass die $()Bash versuchen würde, was auch immer settitle zurückkehrt , auszuführen . (Ich
starte
35

tmux rename-window -t${TMUX_PANE} "Title Text"

Dies ist der richtige Weg, um tmux-Titel in einem Fenster festzulegen. Die Variable $ TMUX_PANE wird von tmux gesetzt und dient zur Unterscheidung zwischen verschiedenen Bereichen.

UtahJarhead
quelle
2
Da es das aktive Fenster ist, denke ich nicht, dass das -t${TMUX_PANE}notwendig ist (zumindest war es nicht für mich).
Christopher
8
@Christopher Wenn Sie beispielsweise Windows ausführen sleep 3und wechseln, gibt die Eingabeaufforderung andernfalls den Befehl an das falsche Fenster aus, wenn der Energiesparmodus abgeschlossen ist. (Dies ist der Grund, warum ich hierher gekommen bin, +1).
Quornian
16

Nur für Leute, die hierher gekommen sind, um zu suchen, wie man den Titel einer tmux-Sitzung ändert:

Ctrl+ B,$

Dadurch erhalten Sie eine Eingabeaufforderung, in der Sie die aktive Sitzung umbenennen können.

Verwenden Sie stattdessen komma, um das aktive Fenster zu ändern:

Ctrl+ B,,

siehe: Wie benenne ich eine Sitzung in tmux um?

rubo77
quelle
8

Durch die Kombination der Antworten von Mikel und UtahJarhead habe ich .zshrcdieses Problem folgendermaßen gelöst:

ssh() {
    tmux rename-window "$*"
    command ssh "$@"
    exit
}

Ich habe die automatische Fensterumbenennung standardmäßig aktiviert und kann sie nach dem Beenden des Remote-Hosts nicht wieder aktivieren. Daher schließe ich das Fenster nur vollständig - kein Problem für meinen Workflow. Wenn Sie es lieber in "bash" umbenennen möchten, können Sie die exitZeile durch ersetzen tmux rename-window "bash".

Christopher
quelle
1
Ich benutze tmux rename-window hostname -snach dem Befehl ssh "@ $", es "setzt" im Grunde den Titel auf meinen "Gateway" Rechner zurück.
andrei
7

Anstelle von exitoder können tmux rename-window "bash"Sie verwenden

ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
            tmux rename-window "$*"
            command ssh "$@"
            tmux set-window-option automatic-rename "on" 1>/dev/null
    else
            command ssh "$@"
    fi
}

Dadurch wird die normale Funktion wieder aktiviert, die das Fenster automatisch für die nächsten Befehle umbenennt.

Der ifBlock verhindert, dass (ohne ihn) das tmuxaktuelle Fenster von sshBefehlen umbenannt wird, die auf anderen Shells (außerhalb von tmux) verwendet werden.

tarczewski
quelle
Ich habe mich für ein if env | grep -q "TMUX_PANE"; thenanstatt des ps -p...Zeugs entschieden, aber das gleiche Prinzip.
Atomicules
1

Ich weiß, dass dies vor langer Zeit beantwortet wurde, aber ich dachte, ich würde hinzufügen, was ich gefummelt und gefunden habe (basierend auf der akzeptierten Antwort). Ich habe dies zu / etc / bashrc aller meiner Server hinzugefügt (einfach zu tun mit Stoff, Puppe, etc)

settitle() {
    printf "\033k$1\033\\"
}
bash_prompt_command() {
    settitle "`hostname -s`:$PWD"
}
PROMPT_COMMAND=bash_prompt_command

Und es setzt den Fensternamen automatisch in screen oder tmux.

Brian
quelle
Wir verwenden interne DNS, hostname -sentfernen also das zusätzliche Domainmaterial, sodass server1.internal.local nur als server1 angezeigt wird
Brian,
1

Eine andere Lösung wäre, das aktive Fenster nach der ssh-Sitzung in den vorherigen Namen umzubenennen:

ssh() {

local code=0
local ancien

ancien=$(tmux display-message -p '#W')

if [ $TERM = tmux -o $TERM = tmux-256color ]; then

    tmux rename-window "$*"

    command ssh "$@"

    code=$?
else
    command ssh "$@"

    code=$?
fi

tmux rename-window $ancien

return $code
}
Chimay
quelle
0

Dies funktioniert in tmux 2.1und mit zsh lokal und auf Servern:

ssh() {
    tmux set-option allow-rename off 1>/dev/null
    tmux rename-window "ssh/$*"
    command ssh "$@"
    tmux set-option allow-rename on 1>/dev/null
}

Ich musste die Erlaubnis-Umbenennungs-Option manuell deaktivieren, bevor ich den Windows-Namen änderte - andernfalls wurde er auf den meisten meiner Server auf den aktuellen Pfad geändert (auch dort mit zsh). Das Gute ist: Wenn Sie die Option zum Zulassen und Umbenennen erneut aktivieren, funktioniert sie sofort.

FSchndr
quelle
0

Fügen Sie dies zu .profileoder hinzu.bashrc

# Change window name for `tmux`
ssh() {
    if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
        #tmux rename-window "$(echo $* | cut -d . -f 1)"
        tmux rename-window "$(echo $* | cut -d @ -f 2)"
        command ssh "$@"
        tmux set-window-option automatic-rename "on" 1>/dev/null
    else
        command ssh "$@"
    fi
}
user536642
quelle
0

In all diesen Beispielen möchte ich Folgendes erwähnen:

command ssh "$@"

Möglicherweise möchten Sie den Exitcode abrufen und die Funktion damit beenden, andernfalls wie folgt vorgehen:

ssh server false

Gibt 0 zurück.

command ssh"$@"
_exitcode=$?
#other code
exit $_exitcode

Beendet ssh mit dem Rückkehrcode von ssh.

josefwells
quelle