linux - servidor - Encuentra la dirección IP del cliente en una sesión SSH
instalar ssh linux mint (17)
El último comando para que los últimos 10 usuarios inicien sesión en la máquina es el
last|head
.Para obtener todos los usuarios, simplemente use el
last
comando
Tengo un script que debe ejecutar una persona que inicia sesión en el servidor con SSH .
¿Hay alguna forma de averiguar automáticamente a qué dirección IP se está conectando el usuario?
Por supuesto, podría preguntarle al usuario (es una herramienta para programadores, así que no hay problema con eso), pero sería mejor si me entero.
Buscar conexiones SSH para la cuenta "myusername";
Tome la primera cadena de resultados;
Tome la quinta columna;
Dividir por ":" y devolver la 1ª parte (el número de puerto no es necesario, solo queremos IP):
netstat -tapen | grep "sshd: myusername" | cabeza -n1 | awk ''{split ($ 5, a, ":"); imprimir a [1]} ''
De otra manera:
quien soy yo | awk ''{l = longitud ($ 5) - 2; print substr ($ 5, 2, l)} ''
Compruebe si hay una variable de entorno llamada:
$SSH_CLIENT
O
$SSH_CONNECTION
(o cualquier otra variable de entorno) que se establece cuando el usuario inicia sesión. Luego, procese el script de inicio de sesión de usuario.
Extrae la IP:
$ echo $SSH_CLIENT | awk ''{ print $1}''
1.2.3.4
$ echo $SSH_CONNECTION | awk ''{print $1}''
1.2.3.4
Intente lo siguiente para obtener solo la dirección IP a través de SSH:
Command: ifconfig
Ejemplo:
stalinrajindian@ubuntuserver:~$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.30.3.27 netmask 255.255.255.0 broadcast 172.30.3.255
inet6 fe80::a00:27ff:fe8b:9986 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:8b:99:86 txqueuelen 1000 (Ethernet)
RX packets 4876 bytes 1951791 (1.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 775 bytes 73783 (73.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 78 bytes 5618 (5.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 78 bytes 5618 (5.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Intente lo siguiente para obtener solo la dirección IP:
who am i|awk ''{ print $5}''
Linux: ¿quién soy yo? awk ''{print $ 5}'' | sed ''s / [()] // g''
AIX: ¿quién soy yo? awk ''{print $ 6}'' | sed ''s / [()] // g''
Mejorando en una respuesta anterior. Da dirección IP en lugar de nombre de host. --ips no disponible en OS X.
who am i --ips|awk ''{print $5}'' #ubuntu 14
más universal, cambie $ 5 a $ 6 para OS X 10.11:
WORKSTATION=`who -m|awk ''{print $5}''|sed ''s/[()]//g''`
WORKSTATION_IP=`dig +short $WORKSTATION`
if [[ -z "$WORKSTATION_IP" ]]; then WORKSTATION_IP="$WORKSTATION"; fi
echo $WORKSTATION_IP
Por lo general, hay una entrada de registro en / var / log / messages (o similar, dependiendo de su sistema operativo) que puede grep con el nombre de usuario.
Puede obtenerlo de forma programática a través de una biblioteca SSH ( https://code.google.com/p/sshxcute )
public static String getIpAddress() throws TaskExecFailException{
ConnBean cb = new ConnBean(host, username, password);
SSHExec ssh = SSHExec.getInstance(cb);
ssh.connect();
CustomTask sampleTask = new ExecCommand("echo /"${SSH_CLIENT%% *}/"");
String Result = ssh.exec(sampleTask).sysout;
ssh.disconnect();
return Result;
}
Puedes usar el comando:
server:~# pinky
eso te dará algo como esto:
Login Name TTY Idle When Where
root root pts/0 2009-06-15 13:41 192.168.1.133
Simplemente escriba el siguiente comando en su máquina Linux:
who
Suponiendo que abre una sesión interactiva (es decir, asigna un pseudo terminal ) y tiene acceso a stdin, puede llamar a ioctl en ese dispositivo para obtener el número de dispositivo (/ dev / pts / 4711) e intentar encontrarlo en /var/run/utmp (donde también estará el nombre de usuario y la dirección IP desde donde se originó la conexión).
netstat funcionará (en la parte superior algo así) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLECIDO
un hilo viejo con muchas respuestas, pero ninguna es exactamente lo que estaba buscando, así que estoy contribuyendo al mío:
sshpid=$$
sshloop=0
while [ "$sshloop" = "0" ]; do
if [ "$(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT)" ];
then
read sshClientIP sshClientSport sshClientDport <<< $(strings /proc/${sshpid}/environ | grep ^SSH_CLIENT | cut -d= -f2)
sshloop=1
else
sshpid=$(cat /proc/${sshpid}/status | grep PPid | awk ''{print $2}'')
[ "$sshpid" = "0" ] && sshClientIP="localhost" && sshloop=1
fi
done
este método es compatible con ssh directo, usuarios sudoed y sesiones de pantalla. Seguirá por el árbol de procesos hasta que encuentre un pid con la variable SSH_CLIENT y luego registre su IP como $ sshClientIP. si sube demasiado al árbol, registrará el IP como ''localhost'' y abandonará el ciclo.
netstat -tapen | grep ssh | awk ''{ print $10}''
Salida:
dos # en mi experimento
netstat -tapen | grep ssh | awk ''{ print $4}''
da la dirección IP.
Salida:
127.0.0.1:22 # in my experiment
Pero los resultados se mezclan con otros usuarios y esas cosas. Necesita más trabajo.
netstat -tapen | grep ssh | awk ''{ print $4}''
who am i | awk ''{print $5}'' | sed ''s/[()]//g'' | cut -f1 -d "." | sed ''s/-/./g''
export DISPLAY=`who am i | awk ''{print $5}'' | sed ''s/[()]//g'' | cut -f1 -d "." | sed ''s/-/./g''`:0.0
Lo uso para determinar mi variable DISPLAY para la sesión cuando inicio sesión a través de ssh y necesito mostrar X remota.