Question Comment puis-je changer l'apparence de mon terminal (Linux) lorsque je passe à SSH sur une machine distante?


Je me trouve parfois avec plusieurs terminaux ouverts, dont certains sont intégrés à d'autres machines (de production). Si je lance une commande comme "supprimer toutes les tables de la base de données" sur l'un de ces terminaux ssh-ed, je peux potentiellement détruire des tonnes de données client. Mais dans le développement, bien sûr, je dois exécuter ces commandes de temps en temps.

Donc, je me demandais: y a-t-il un moyen d'obtenir mon terminal (idéalement celui de GNOME intégré, mais je serais disposé à passer à un autre programme de terminal si nécessaire) pour modifier son apparence visuelle lorsque je suis ssh -ed dans une machine distante? Idéalement, j'aurais mon arrière-plan noir normal, mais lorsque je me connecterais à une machine distante, l'arrière-plan deviendrait rouge. Peut-être que les bordures de la fenêtre changeraient en rouge et commenceraient à clignoter ou quelque chose comme ça.

Les détails du changement d'apparence ne sont pas importants cependant: ce qui est important, c'est de rendre immédiatement évident que je dois être plus prudent lorsque je travaille sur un terminal ssh-ed quelque part. Est-ce possible?

P.S. J'ai trouvé SSH contextuel, ce qui est exactement ce que je veux ... sauf que c'est Mac seulement :-(


4
2018-05-15 20:30


origine


La réponse acceptée ne donne pas une apparence différente basée sur SSH. Pour que vous ayez besoin de changer quelque chose en fonction de la météo, la session en cours est une session SSH, dont la détection est décrite ici: askubuntu.com/a/538455 - ShadSterling


Réponses:


Je suggère de régler votre $ PS1 sur des informations pertinentes, telles que le nom d'hôte, etc. Vous pouvez vérifier la page de manuel de votre shell de choix pour plus de détails.

Un exemple de ce que vous pourriez faire pour votre PS1 frapper

J'ai moi-même un test dans mon ~ / .subbash /rapide qui définit la couleur de l'invite en fonction du serveur. *

* voir la fonction __prompt_command ()

Façons de changer votre PS1

Il y a un certain nombre de façons de personnaliser la PS1, ça sonne comme si vous vouliez quelque chose d'un peu plus perceptible, donc mes exemples seront un peu plus compliqués alors il suffit d'ajouter le \H à la PS1. Pour utiliser l'un des éléments suivants, vous pouvez les ajouter à votre ~/.bashrc (sur les serveurs distants, sinon les deux. Je synchronise la même conf entre tous mes ordinateurs)

Remarque: Pour les rendre plus lisibles, les éléments suivants supposent que ces vars sont déclarés.
La var pourrait facilement être remplacée par le contenu.
En outre, ces exemples sont biaisés, vous devrez peut-être modifier d'autres shells.

RCol='\[\e[0m\]'    # Text Reset
Red='\[\e[0;31m\]'  # Red
Gre='\[\e[0;32m\]'  # Green
Yel='\[\e[0;33m\]'  # Yellow
Blu='\[\e[0;34m\]'  # Blue
Pur='\[\e[0;35m\]'  # Purple
Cya='\[\e[0;36m\]'  # Cyan
Whi='\[\e[0;37m\]'  # White

Vérification de la racine

Une chose que vous pourriez aimer est de tester le $ USER, si c'est un compte root, ou peut-être un compte "production" seulement:

if [ $UID -eq "0" ];then
    PS1="${Red}\h \W ->${RCol} "        # Set prompt for root
else
    PS1="\h \W -> "
fi

Cela rendrait l'invite rouge si vous êtes à la racine.

Vérification de l'hôte

Vous pouvez également tester les informations sur la machine en cours et définir les couleurs en fonction de cela:

PS1=
PSCol=
if [ $HOSTNAME == 'moving-computer-of-doom' ]; then
    PSCol="$Cya"                # For Main Computer
elif [ $HOSTTYPE == 'arm' ]; then
    PSCol="$Gre"                # For pi
elif [ $HOSTNAME == 'ma.sdf.org' ]; then
    PSCol="$Blu"                # For MetaArray
elif [[ $MACHTYPE =~ arm-apple-darwin ]]; then
    PSCol="$Gre"                # For iOS
elif [ $MACHTYPE == 'i486-pc-linux-gnu' ]; then
    PSCol="$Whi"                # For Netbook
elif [[ "$MACHTYPE" == "x86_64--netbsd" && "$OSTYPE" == "netbsd" ]]; then
    PSCol="$Yel"                # For Main Cluster
else
    PS1+="\h "              # Un-designated catch-all
fi

PS1+="${PSCol}\W ->${RCol} "

Cela définirait le cyan rapide si sur mon ordinateur portable, vert pour mon pi ou iOS, etc. etc.
Si if n'était pas répertorié, cela ajouterait le nom d'hôte à l'invite.
Donc, si vos serveurs de production avaient quelque chose de facile à tester (comme un nom d'hôte similaire, vous pourriez l'utiliser)

PROMPT_COMMAND

Pour la plupart, cela fonctionnerait bien sans cela.
Si vous commencez à ajouter des éléments que vous voudriez réévaluer plus souvent lors de la connexion (peut-être le statut git d'un répertoire), vous pouvez utiliser une fonction PROMPT_COMMAND pour évaluer le PS1 après chaque commande.

Le ci-dessus fonctionne bien sans cela.

Remarque: Désolé si ceux-ci semblent déroutants, ceux-ci proviennent de paramètres que j'utilise et modifiés pour fonctionner sans le reste de mes paramètres.


6
2018-05-15 20:44



Merci, mais même si, après avoir lu votre réponse (et les deux liens que vous avez fournis), je ne comprends toujours pas comment je change $ PS1 en réponse à un ssh (puis le change lorsque je quitte le serveur distant). Avez-vous une chance de l'expliquer? - machineghost
@machineghost l'exemple aide-t-il? Faut-il expliquer quelque chose de plus? - demure
C'était parfait, merci beaucoup :-) - machineghost
Peut-être une question idiote, mais je suppose que les invites ci-dessus ne fonctionnent que si vous vous assurez de copier votre .bashrc sur l'hôte distant? Est-ce vrai? J'adorerais que ça ne soit pas. : P - Josh Gagnon
@JoshGagnon Oui, un $ PS1 (comme les autres envvars) est local uniquement. Personnellement, j'utilise un repo git pour garder mes fichiers de points au même endroit et les placer sur toutes les machines dont j'ai besoin. gitorious.org/demure/dotfiles - demure


Ceci est un excellent article que j'ai utilisé pour personnaliser mon invite bash:

http://www.ibm.com/developerworks/linux/library/l-tip-prompt/

Il est facile de voir à quel moment je suis connecté à mon serveur, car j'ai défini le nom d'hôte de mon invite comme étant rouge.

La valeur que j'utilise en tant que PS1 dans bash_profile est la suivante:

PS1 = "[\ e [32; 1m] \ u [\ e [0m] [\ e [34; 1m] @ [\ e [0m] [\ e [31; 1m] \ h [\ e [0m] : [\ e [34; 1m] \ w $ [\ e [0m] "

Cela me donne un nom d'utilisateur en vert, suivi d'un signe bleu "@", puis le nom d'hôte est en rouge, puis "~ $" en bleu. Vous pouvez probablement voir à quel point il est facile de personnaliser pour vous aider à voir facilement lorsque vous êtes connecté à différents serveurs

Assurez-vous de lire l'article correctement car il explique comment échapper correctement à chaque séquence. Ne pas échapper aux séquences peut entraîner un comportement imprévisible lors de la saisie de commandes plus longues.


3
2018-05-15 20:51



Merci, cela explique totalement comment changer l'invite bash. Malheureusement, cela n'explique pas comment changer l'invite bash en réponse à l'exécution de "ssh" (et la modifier ensuite). - machineghost


Apparemment, toutes les réponses précédentes ne fonctionnent qu'avec Bash. J'utilise Busybox sur certains appareils et j'ai donc besoin d'une alternative.

Selon ce vous pouvez ajouter une ligne générique à votre script de connexion qui devrait fonctionner (et fait pour moi sur plusieurs hôtes variés):

echo -n "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"

1
2017-12-10 19:08