Establezca $ PS1 de manera diferente en la computadora local y en la sesión ssh

9

Mantengo mi directorio de inicio bajo control de versiones, para que mi configuración básica esté fácilmente disponible en cualquier computadora.

Mi símbolo del sistema bash en mi computadora local es una cosa complicada y colorida que incluye el repositorio git actual y su estado. Pero prefiero tener un user@host ~ $símbolo del sistema simple cuando entro sshen una máquina remota.

Me gustaría poder actualizar mi .profilepara que configure una complicada $PS1cuando se ejecuta localmente y una simplificada cuando se ejecuta en una sshsesión.

Básicamente, me gustaría algo como una $AM_I_LOGGED_IN_VIA_SSHvariable para probar en mi .profile. ¿Es eso posible?

Will McCutchen
fuente

Respuestas:

8

Cuando inicia sesión a través de SSH, se establecen varias variables de entorno adicionales. Puede usarlos como prueba para configurar su PS1 en su perfil.

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

Si marca su entorno ( env | grep SSH) encontrará varios candidatos como $SSH_CLIENT, $SSH_CONNECTIONy $SSH_TTY; La lista exacta dependerá de la sshdversión.

geekosaur
fuente
2

Si su sshd no proporciona variables útiles, puede usar

ps -p $PPID

o algún otro truco ps aleatorio (si su shell no está configurado $PPID) para ver si el proceso padre del shell es su proceso de inicio de sesión remoto o no. Entonces, si parent-is-remote-thingie cambia $ PS1. Y luego descargue OpenSSH y use las sugerencias de geekosaur / Caleb porque su servidor ssh es basura. ;)

O bien, puede usar la salida de "quién soy yo", tomar el último campo (es decir, $( who am i | awk '$0=$NF')) y verificar si el host es remoto o local para decidir si inició sesión local o remotamente.

O puede activar la salida de $(hostname)para que su shell use el $ PS1 apropiado en hosts específicos.

O, vamos a volvernos locos. Si está utilizando un shell moderno, como bash, ksh93 o zsh, puede aprovechar el hecho de que $ PS1 se reevalúa en la ejecución. Por lo tanto, podría incluir un bloque condicional en línea para hacer lo loco si su cwd está dentro del repositorio y algo más afuera. Por ejemplo, aquí estoy haciendo mi cambio rápido dependiendo del directorio en el que estoy usando [[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" ), básicamente.

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$

Claro, la definición de $ PS1 se verá loca en su perfil, pero luego solo obtendrá cosas super-coloridas-git cuando esté realmente en el repositorio de git, mientras tenga colores regulares en otros lugares. :) Tenga en cuenta que debe usar comillas simples alrededor de la asignación de PS1. No desea que las variables se expandan cuando se asigna PS1; desea que se expandan cuando $ PS1 se evalúa más tarde. Entonces, comillas simples.

dannysauer
fuente
1

Si PermitUserEnvironmentestá habilitado en sshd, puede usarlo ~/.ssh/environmentpara crear $PS1y luego detectar la presencia de un valor en su script que normalmente lo establece.

Ignacio Vazquez-Abrams
fuente
0

Como complemento a la respuesta de Ignacio, para dejar las cosas claras, la PermitUSerEnvironmentopción debe estar habilitada en el lado del servidor para que esto funcione. Si el servidor no habilita esta opción, no tendrá una sesión ssh colorida con ese servidor.

tymik
fuente