Correggi il titolo del terminale dopo la registrazione remota SSH su un'altra macchina


18

ora sto usando un codice perl a una riga per cambiare i titoli delle mie barre dei terminali,

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

ma ogni volta che faccio ssh su un'altra macchina remota, il titolo verrà modificato dall'host (per il quale non sono particolarmente infastidito). Ma dopo che esco dalla connessione, il titolo modificato rimane. C'è un modo per risolvere questo problema? essenzialmente voglio un titolo fisso per i miei terminali quando opero localmente.

Uso principalmente terminale e terminatore xfce in CentOS o Debian. Grazie.

MODIFICARE

Un'altra sottigliezza è che, piuttosto che avere tutti i terminali con lo stesso nome, preferirei avere la libertà di modificare i loro titoli al volo, ma proibirei solo alla sessione SSH di modificare ciò che ho modificato.

Risposte:


6

Non conosco i titoli delle finestre, ma ho cercato di fare in modo che il mio sistema facesse qualcosa per terminare una sessione ssh, in realtà dopo aver terminato una sessione ssh. In breve: non funziona così. Fondamentalmente hai tre scelte:

  1. Scrivi un wrapper attorno a ssh, ovvero uno script di shell eseguibile chiamato sshche ha la precedenza sul /usr/bin/sshtuo $ PATH che contiene la linea exec /usr/bin/ssh $@da qualche parte nel mezzo. Questo ti consente di fare alcune operazioni con la shell prima e dopo l'esecuzione dell'effettivo binario ssh, mantenendo al minimo il sovraccarico.

  2. Scrivi una patch contro i sorgenti SSH di tua scelta per fornirti un hook di cleanup che esegua un comando shell passato tramite riga di comando o qualche impostazione di configurazione. Questo è quello che vogliamo.

  3. Hanno PROMPT_COMMANDvalutato l'output di history. Fondamentalmente un approccio più generico e più brutto a 1.


fondamentalmente ho appena scritto un semplice script per afferrare il titolo corrente e salvarlo prima della sessione SSH, quindi recuperare il titolo in seguito.
nye17,

4
@ nye17 Puoi pubblicare lo script della soluzione che hai usato?
Reg Mem

Di seguito ho pubblicato il mio script della soluzione. dovrebbe essere una corrispondenza ravvicinata di ciò che ha fatto @nye17. unix.stackexchange.com/a/341277/112190
phyatt

7

Soluzione: aggiungere alcune funzioni ~ / .bashrc per fare qualcosa dopo i comandi ssh e su

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
}

Nota: riavviare bash dopo le modifiche su ~ / .bashrc

Esempio:

# 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()

Spero possa aiutare.


leggermente inesatto da dire in revertquanto non si controlla per vedere cosa fosse prima ... se si è interrogato e salvato il valore precedente tho ;-)
nhed

4

Configurare il dotfile della shell locale (ad es. $PROMPT_COMMANDIn ~/.bashrc) per impostare il titolo del terminale in modo appropriato, usando lo stesso meccanismo.

Per esempio:

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

1. prompt_command non ha nulla a che fare con il titolo della finestra del terminale, giusto? Ho impostato prompt_command ma solo per il prompt. 2. Ho ancora bisogno di un meccanismo per ricordare e attivare le mie impostazioni locali dopo essere uscito dalla registrazione ssh.
nye17,

Il comando prompt emette semplicemente la sequenza di escape necessaria affinché il terminale rinomini la barra del titolo. :)
Ripristina Monica il

ma voglio anche la libertà di rinominare il terminale che desidero, piuttosto che avere ogni singola sessione con lo stesso nome. In pratica, in pratica modifico il manuale del titolo del terminale e spero che quel terminale rimanga con un titolo fisso anche dopo il login / logout SSH. Ha senso?
nye17,

1
Quindi, inserisci il titolo desiderato in una variabile e crealo.
Ignacio Vazquez-Abrams,

Se si utilizza questa sequenza di escape del terminale per impostare un titolo null (ad es., export PROMPT_COMMAND="printf '\e]0;\7\n'"), Il proprio emulatore di terminale può impostare il titolo della finestra come meglio ritiene opportuno. Quando si invia a un host remoto che imposta il titolo del terminale, il proprio emulatore di terminale mostrerà quel titolo e, quando ci si disconnette, tornerà a usare il proprio titolo. Almeno, è così che funziona l'app macOS Terminal.
Claymation

3

AGGIUNGI queste righe a ~ / .bashrc

# 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

funziona bene con i Linux basati su debian


1
Non stabilisce il titolo però ...
Bananguin,

Di solito funziona meglio da usare PROMPT_COMMANDinvece di usare PS1, dal momento che non è necessario includere il \[ \]bracketing e può eliminare alcune citazioni.
Chris Page

2

Una soluzione è cambiare la variabile terminale in vt100 prima di lanciare, ad es. Run

export TERM=vt100

Questo funziona perché di solito gli script di inizializzazione guardano la variabile terminale e cambiano solo il titolo, è xterm. Perdi schermate, colori e forse alcune altre fantasiose funzionalità che potresti apprezzare o meno.

Se vuoi mantenere il terminale locale come xterm, alias ssh per cambiare al volo la variabile terminale, come

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

cambia il modo in cui le cose vengono visualizzate. i colori non sono mostrati
npk

0

Ho risolto questo problema aggiungendolo alla mia PS1 nel mio file .bashrc.

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

Pertanto l'intera riga è simile a questa (ho personalizzato il mio PS !:

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

Spero che aiuti gli altri.


Se si utilizza questa sequenza di escape del terminale per impostare un titolo null (ad es., export PS1='\[\033]0;\007\]\h:\W \u\$ '), Il proprio emulatore di terminale può impostare il titolo della finestra come meglio ritiene opportuno. Quando si invia a un host remoto che imposta il titolo del terminale, il tuo emulatore di terminale lo mostrerà e, quando ti disconnetti, tornerà a usare il proprio titolo. Almeno, è così che funziona l'app macOS Terminal.
Claymation

0

Altre risposte non funzionerebbero per me quando esco da SSH, ma mi avvicinano. L'aggiunta di setw rinominazione automatica funziona quando esco dalla sessione ssh remota in modo che si rinomini automaticamente e non debba più uscire dalla finestra per ripristinare. [Gennaio 2018 - Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.