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 halt
a restart
desde 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_CLIENT
se 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 afx
y el TTY para el shell que no se ejecutaps
será 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:)
who
con dos argumentos adicionales.who am i
es lo mismo quewho is me
orwho is awesome
owho potato potato
. Un hecho que me pareció un poco interesante.Aquí hay una gran respuesta que encontré en unix.stackexchange :
SSH_CLIENT
oSSH_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_keep
en elsudoers
modo 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
sshd
o lo que sea el nombre del proceso padre de tu shell actual.fuente
ps -o cmd= $PPID
oawk '/^Name:/ {print $2}' /proc/$PPID/status
Creo 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_ssh
en 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_name
será el nombre de este proceso ("sshd", por ejemplo).fuente