Correction du titre du terminal après la connexion à distance SSH à une autre machine

18

en ce moment j'utilise un code perl d'une ligne pour changer les titres de mes barres de terminal,

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

mais à chaque fois que je ssh vers une autre machine distante, le titre sera modifié par l'hôte (ce qui ne me dérange pas particulièrement). Mais après avoir quitté la connexion, le titre modifié reste. Y'a t'il un moyen d'arranger cela? essentiellement, je veux un titre fixe pour mes terminaux lors d'un fonctionnement local.

J'utilise principalement le terminal et le terminateur xfce sous CentOS ou Debian. Merci.

ÉDITER

Une autre subtilité est que, plutôt que d'avoir tous les terminaux du même nom, je préférerais avoir la liberté de modifier leurs titres à la volée mais d'interdire uniquement à la session SSH de modifier ce que j'ai modifié.

nye17
la source

Réponses:

6

Je ne connais pas les titres des fenêtres, mais j'ai essayé de faire en sorte que mon système fasse quelque chose pour terminer une session ssh - en fait, après avoir terminé une session ssh. En bref: cela ne fonctionne pas comme ça. Fondamentalement, vous avez trois choix:

  1. Écrivez un wrapper autour de ssh, c'est-à-dire un script shell exécutable nommé sshqui a priorité sur /usr/bin/sshvotre $ PATH qui contient la ligne exec /usr/bin/ssh $@quelque part en son milieu. Cela vous permet d'avoir votre shell faire quelques trucs avant et après l'exécution du binaire ssh efficace, tout en gardant le eoverhead au minimum.

  2. Écrivez un correctif contre les sources SSH de votre choix pour vous fournir un hook de nettoyage qui exécute une commande shell passée via la ligne de commande ou un paramètre de configuration. Voilà ce que nous voulons.

  3. Avoir PROMPT_COMMANDévaluer la sortie de history. Fondamentalement, une approche plus générique et plus laide de 1.

Bananguin
la source
Fondamentalement, je viens d'écrire un script simple pour récupérer le titre actuel et l'enregistrer avant la session SSH, puis récupérer le titre par la suite.
nye17
4
@ nye17 Pouvez-vous publier le script de solution que vous avez utilisé?
Reg Mem
J'ai posté mon script de solution ci-dessous. devrait correspondre étroitement à ce qu'a fait @ nye17. unix.stackexchange.com/a/341277/112190
phyatt
7

Solution: ajoutez des fonctions ~ / .bashrc pour faire quelque chose après les commandes ssh et 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
}

Remarque: redémarrez bash après les modifications dans ~ / .bashrc

Exemple:

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

J'espère que cela pourra aider.

phyatt
la source
un peu inexact à dire revertcar vous ne vérifiez pas ce que c'était avant ... si vous avez interrogé et enregistré la valeur précédente tho ;-)
nhed
4

Configurez votre fichier dot shell local (par exemple $PROMPT_COMMANDdans ~/.bashrc) pour définir le titre du terminal de manière appropriée, en utilisant le même mécanisme.

Par exemple:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"
Ignacio Vazquez-Abrams
la source
1. prompt_command n'a rien à voir avec le titre de la fenêtre de votre terminal, non? J'ai configuré prompt_command mais uniquement pour l'invite. 2. J'ai toujours besoin d'un mécanisme pour mémoriser et activer mon paramètre local après avoir quitté la journalisation ssh.
nye17
La commande d'invite émet simplement la séquence d'échappement nécessaire à votre terminal pour renommer sa barre de titre. :)
Rétablir Monica le
mais je veux aussi la liberté de renommer le terminal que je veux, plutôt que d'avoir chaque session unique du même nom. En pratique, je modifie essentiellement le manuel du titre du terminal et j'espère que le terminal conservera son titre fixe même après la connexion / déconnexion SSH. Est-ce que ça fait du sens?
nye17
1
Alors, mettez le titre souhaité dans une variable et affichez-le.
Ignacio Vazquez-Abrams
Si vous utilisez cette séquence d'échappement de terminal pour définir un titre nul (par exemple, export PROMPT_COMMAND="printf '\e]0;\7\n'"), votre émulateur de terminal peut définir le titre de la fenêtre comme bon lui semble. Lorsque vous SSH vers un hôte distant qui définit le titre du terminal, votre émulateur de terminal affiche ce titre et lorsque vous vous déconnectez, il revient à utiliser son propre titre. C'est du moins ainsi que fonctionne l'application macOS Terminal.
claymation
3

AJOUTEZ ces lignes à ~ / .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

fonctionne bien avec les linux basés sur Debian

hrushikesh
la source
1
IL ne définit pas le titre si ...
Bananguin
Il est généralement préférable d'utiliser PROMPT_COMMANDplutôt que d'utiliser PS1, car vous n'avez pas à inclure le \[ \]bracketing et cela peut éliminer certains guillemets.
Chris Page
2

Une solution consiste à changer la variable de terminal en vt100 avant ssh'ing, par exemple exécuter

export TERM=vt100

Cela fonctionne car généralement les scripts d'initialisation regardent la variable de terminal et ne la modifient que le titre c'est xterm. Vous perdez des écrans, des couleurs et peut-être d'autres fonctionnalités fantaisistes que vous apprécierez ou non.

Si vous souhaitez conserver le terminal local en tant que xterm, alias ssh pour modifier la variable de terminal à la volée, comme

alias ssh='TERM=vt100 /usr/bin/ssh'
Viljo Viitanen
la source
cela change la façon dont les choses sont affichées. les couleurs ne sont pas affichées
npk
0

J'ai résolu ce problème en l'ajoutant à ma PS1 dans mon fichier .bashrc.

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

Par conséquent, toute la ligne ressemble à ceci (j'ai personnalisé mon PS!:

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

J'espère que cela aide les autres.

cwiggs
la source
Si vous utilisez cette séquence d'échappement de terminal pour définir un titre nul (par exemple, export PS1='\[\033]0;\007\]\h:\W \u\$ '), votre émulateur de terminal peut définir le titre de la fenêtre comme bon lui semble. Lorsque vous SSH vers un hôte distant qui définit le titre du terminal, votre émulateur de terminal le montrera et lorsque vous vous déconnecterez, il reviendra à l'utilisation de son propre titre. C'est du moins ainsi que fonctionne l'application macOS Terminal.
claymation
0

D'autres réponses ne fonctionneraient pas pour moi lorsque je quitte SSH, mais elles me rapprochent. L'ajout de renommage automatique de setw fonctionne lorsque je quitte la session ssh distante afin qu'il se renomme automatiquement et n'ait plus à quitter la fenêtre pour réinitialiser. [Jan. 2018 - Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
solstis
la source