Actualmente estoy configurando una configuración bash bastante compleja que se utilizará en varias máquinas. Intento averiguar si es posible determinar si he iniciado sesión a través de SSH o en una máquina local. De esta manera podría, por ejemplo, establecer algunos alias dependiendo de ese hecho. Al igual que el aliasing halta restartdesde que detuvo a un servidor remoto podría no ser la mejor cosa que hacer.
Lo que sé hasta ahora es que la variable de entorno SSH_CLIENTse establece cuando inicié sesión a través de ssh. Desafortunadamente, esta variable se descarta cuando inicio un shell de superusuario con sudo -s. También sé que puedo pasar un parámetro a sudo que le indica a sudo que copie todas mis variables de entorno al nuevo entorno de shell, pero si no quiero hacer esto, ¿hay alguna otra manera?

ps afxy el TTY para el shell que no se ejecutapsserá el otro inicio de sesión.who am i.who am i, para que pueda determinar a partir de ahí si está SSHing o no. Esto funciona:hostname=$(who am i | cut -f2 -d\( | cut -f1 -d:)whocon dos argumentos adicionales.who am ies lo mismo quewho is meorwho is awesomeowho potato potato. Un hecho que me pareció un poco interesante.Aquí hay una gran respuesta que encontré en unix.stackexchange :
SSH_CLIENToSSH_TTY, es una sesión ssh.ps -o comm= -p $PPID. Si es asísshd, es una sesión ssh.fuente
Se podría añadir
SSH_*queenv_keepen elsudoersmodo que esto puede ser detectado mientras se cambia a otro usuario.fuente
Si desea saber si bash shell es directamente un proceso secundario de sshd (no n> 1 capas de profundidad) puede
debería darte
sshdo lo que sea el nombre del proceso padre de tu shell actual.fuente
ps -o cmd= $PPIDoawk '/^Name:/ {print $2}' /proc/$PPID/statusCreo que quieres repensar la forma en que piensas el problema. La pregunta no es "¿He iniciado sesión a través de SSH, porque quiero desactivar ciertos comandos". Es "estoy conectado en la consola, porque entonces habilitaré ciertos comandos".
fuente
Sí, como otros señalaron, la información está en presencia de su IP entre paréntesis en la salida de
who am i.Puede usar expresiones regulares de Bash para detectarlo:
fuente
Se me ocurrió lo siguiente, basado en consejos de otros aquí.
Utiliza una variable para el almacenamiento en caché: lo estoy usando en mi tema de shell.
Fuente:
is_sshen https://github.com/blueyed/oh-my-zsh/blob/master/themes/blueyed.zsh-theme#L51-63 .fuente
Busque el cmdline primario y la recurse de su shell. Tal vez algo como lo siguiente:
Editado para que realmente funcione :)
fuente
Todas las otras respuestas funcionan si está en el primer nivel de inicio de sesión. Pero si, una vez que inicias sesión, ejecutas 'su' o 'sudo' (en mi caso, para cambiar a una cuenta de usuario sin shell por razones de seguridad, tengo que ejecutar: sudo su - <userid> -s / bin / bash - l) , su solución falla.
Lo siguiente es una solución universal; usando pstree, verificas sshd como padre.
Aquí está la salida del egrep, cuando --quiet se elimina. Muestra toda la jerarquía que coincide si uno está conectado de forma remota.
fuente
Tenga en cuenta que esta respuesta es muy, muy específica de Linux.
Esto supone una suposición clave: el proceso de inicio de sesión no tendrá un TTY de control; probablemente desee comprobar si tiene un TTY de control antes de ejecutar este código (que, según sus requisitos, de todos modos es una apuesta segura).
El código itera hacia arriba a través del árbol de procesos, hasta que encuentra el proceso que no tiene TTY de control.
$initiator_nameserá el nombre de este proceso ("sshd", por ejemplo).fuente