Impostare $ PS1 in modo diverso sul computer locale e nella sessione ssh


9

Tengo la mia directory home sotto il controllo della versione, in modo che la mia configurazione di base sia facilmente disponibile su qualsiasi computer.

Il mio prompt dei comandi bash sul mio computer locale è una cosa complicata e colorata che include l'attuale repository git e il suo stato. Ma preferirei avere un semplice user@host ~ $prompt dei comandi quando sshentro in una macchina remota.

Mi piacerebbe essere in grado di aggiornare il mio in .profilemodo che configuri un complicato $PS1quando si esegue localmente e uno semplificato quando si esegue in una sshsessione.

Fondamentalmente, vorrei qualcosa come una $AM_I_LOGGED_IN_VIA_SSHvariabile da testare nel mio .profile. È possibile?

Risposte:


8

Quando si accede tramite SSH, vengono impostate diverse variabili di ambiente aggiuntive. Puoi usarli come test per impostare la tua PS1 nel tuo .profile.

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

7

Se si controlla il proprio ambiente ( env | grep SSH) troverete diversi candidati, come $SSH_CLIENT, $SSH_CONNECTIONe $SSH_TTY; l'elenco esatto dipenderà dalla sshdversione.


2

Se il tuo sshd non fornisce variabili utili, puoi usarlo

ps -p $PPID

o qualche altro trucco ps casuale (se la shell non si imposta $PPID) per vedere se il processo genitore della shell è il processo di accesso remoto o meno. Quindi se parent-is-remote-thingie cambia $ PS1. E quindi scarica OpenSSH e usa i suggerimenti di geekosaur / Caleb perché il tuo server SSH è spazzatura. ;)

In alternativa, è possibile utilizzare l'output di "who am i", acquisire l'ultimo campo (ovvero, $( who am i | awk '$0=$NF')) e verificare se l'host è remoto o locale per decidere se si è effettuato l'accesso localmente o in remoto.

Oppure puoi attivare l'output di $(hostname)affinché la tua shell usi $ PS1 appropriato su host specifici.

Oppure, andiamo davvero fuori di testa. Se stai usando una shell moderna, come bash, ksh93 o zsh, puoi trarre vantaggio dal fatto che $ PS1 viene rivalutato al momento dell'esecuzione. Quindi, potresti includere un blocco condizionale in linea per fare le cose folli git se il tuo CWD è all'interno del repository e qualcos'altro al di fuori. Ad esempio, qui sto facendo il mio rapido cambiamento a seconda della directory in cui mi trovo utilizzando [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" ), in pratica.

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$

Certo, la definizione di $ PS1 apparirà pazza nel tuo profilo, ma otterrai solo roba git super colorata quando sei effettivamente nel repository git, mentre hai colori regolari altrove. :) Nota che devi usare virgolette singole intorno all'assegnazione PS1. Non si desidera espandere le variabili quando viene assegnata PS1; li vuoi espandere quando $ PS1 viene valutato in seguito. Quindi virgolette singole.


1

Se PermitUserEnvironmentè abilitato in sshd, è possibile utilizzare ~/.ssh/environmentper creare $PS1e quindi rilevare la presenza di un valore nello script che normalmente lo imposta.


0

Come aggiunta alla risposta di Ignacio, per chiarire le cose, l' PermitUSerEnvironmentopzione deve essere abilitata sul lato server affinché funzioni. Se il server non abilita questa opzione, non avrai una sessione ssh colorata con quel server.

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.