Définir $ PS1 différemment sur l'ordinateur local et en session ssh

9

Je garde mon répertoire personnel sous contrôle de version, afin que ma configuration de base soit facilement disponible sur n'importe quel ordinateur.

Mon invite de commande bash sur mon ordinateur local est une chose compliquée et colorée qui inclut le référentiel git actuel et son état. Mais je préfère avoir une simple user@host ~ $invite de commande lorsque j'entre sshdans une machine distante.

Je voudrais pouvoir mettre à jour mon .profileafin qu'il configure un compliqué $PS1lors de l'exécution locale et un simplifié lors de l'exécution dans une sshsession.

En gros, j'aimerais quelque chose comme une $AM_I_LOGGED_IN_VIA_SSHvariable à tester dans mon .profile. Est-ce possible?

Will McCutchen
la source

Réponses:

8

Lorsque vous vous connectez via SSH, plusieurs variables d'environnement supplémentaires sont définies. Vous pouvez les utiliser comme test pour définir votre PS1 dans votre .profile.

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi
Caleb
la source
7

Si vous vérifiez votre environnement ( env | grep SSH) , vous trouverez plusieurs candidats tels que $SSH_CLIENT, $SSH_CONNECTIONet $SSH_TTY; la liste exacte dépendra de la sshdversion.

geekosaure
la source
2

Si votre sshd ne fournit pas de variables utiles, vous pouvez utiliser

ps -p $PPID

ou une autre astuce ps aléatoire (si votre shell n'est pas défini $PPID) pour voir si le processus parent du shell est votre processus de connexion à distance ou non. Ensuite, si parent-is-remote-thingie change $ PS1. Ensuite, téléchargez OpenSSH et utilisez les suggestions de geekosaur / Caleb car votre serveur ssh est indésirable. ;)

Ou, vous pouvez utiliser la sortie de "qui suis-je", saisir le dernier champ (c.-à-d. $( who am i | awk '$0=$NF')) Et vérifier si l'hôte est distant ou local pour décider si vous vous êtes connecté localement ou à distance.

Ou vous pouvez activer la sortie de $(hostname)pour que votre shell utilise la $ PS1 appropriée sur des hôtes spécifiques.

Ou, allons vraiment fou. Si vous utilisez un shell moderne comme bash, ksh93 ou zsh, vous pouvez profiter du fait que $ PS1 est réévalué lors de l'exécution. Donc, vous pouvez inclure un bloc conditionnel en ligne pour faire les trucs fous si votre cwd est dans le référentiel, et quelque chose d'autre à l'extérieur. Par exemple, ici, je fais ma modification rapide en fonction du répertoire dans lequel j'utilise [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" ), en gros.

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

Bien sûr, la définition de $ PS1 semblera folle dans votre profil, mais vous n'obtiendrez alors que des trucs super colorés lorsque vous êtes réellement dans le référentiel git, tandis que vous avez des couleurs régulières ailleurs. :) Notez que vous devez utiliser des guillemets simples autour de l'affectation PS1. Vous ne voulez pas que les variables soient développées lorsque PS1 est affecté; vous souhaitez les développer lorsque $ PS1 est évalué ultérieurement. Donc, guillemets simples.

dannysauer
la source
1

Si PermitUserEnvironmentest activé dans sshd, vous pouvez utiliser ~/.ssh/environmentpour créer $PS1puis détecter simplement la présence d'une valeur dans votre script qui la définit normalement.

Ignacio Vazquez-Abrams
la source
0

En complément de la réponse d'Ignacio, pour que les choses PermitUSerEnvironmentsoient claires, l' option doit être activée côté serveur pour que cela fonctionne. Si le serveur n'active pas cette option, vous n'aurez pas de session ssh colorée avec ce serveur.

tymik
la source