Encuentra la dirección IP del cliente en una sesión SSH


166

Tengo una secuencia de comandos que debe ejecutar una persona que inicie sesión en el servidor con SSH .

¿Hay alguna manera de averiguar automáticamente desde qué dirección IP se conecta 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 enterara.


55
proponer pasar al servidor por defecto, aunque sigue siendo una gran pregunta
BozoJoe

Respuestas:


267

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 usando el script de inicio de sesión del usuario.

Extraer la IP:

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4

@cwd quiero reemplazar la ip en este comando "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" ¿es eso posible?
wutzebaer

2
Esto fue REMOTEHOST para mí.
dramzy

55
solo funciona con usuarios no sudados. por ejemplo, si tiene un usuario ssh y luego escala a la raíz, se crea un nuevo shell y estas variables se pierden, a menos que pueda rastrear a través del árbol para encontrar el pid ssh original y obtener las variables de / proc / $ PID / environmental
Andrej

55
gracias a stackoverflow.com/questions/428109/extract-substring-in-bash, esta respuesta se puede mejorar de manera simple${SSH_CLIENT%% *}
Jeff

@Andrej investigasudo -E
Jeff

105

Podrías 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

13
Eso es increíble :-) Nerd humor ftw una vez más. De acuerdo con pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods

¿Por qué es mi 'Dónde' en mi salida solo muestra el nombre de la máquina y no la dirección IP?
isaganiesteron

Probablemente tienes el servidor de nombres configurado en tu máquina.
vncprado

pinky mostrará a todos los usuarios registrados, no solo a usted
Andrej

33

Pruebe lo siguiente para obtener solo la dirección IP:

who am i|awk '{ print $5}'

bastante seguro si escribes whoami y obtendrás el nombre del usuario conectado. no hay quinta cosa o ip para imprimir lo siento. pero whoami es un comando útil
gerard

15
who am i! = whoamien mi Linux al menos. Hay una quinta cosa, y es el nombre de host del cliente.
kbulgrien

55
Para cualquier otra persona preguntando sobre who am i: La página del manual de whodice: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Entonces, realmente, cualquier cosa con dos palabras funciona, también cosas como who likes icecream.
jmiserez

3
Sobre la base de esta respuesta, la reduje para who -m --ips|awk '{print $5}'que solo tuviera IP y ninguna respuesta de respuesta inversa. Gracias por la ayuda who am i!
Yvan

1
Falla con tmux: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche

19

Simplemente escriba el siguiente comando en su máquina Linux:

who


5
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.


Útil un revestimiento para agregar mi IP a los archivos .htaccess. Gracias. He hecho una modificación para FreeBSD: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' la última parte escapa a los puntos.
Olivier - interfaSys

5

Mejora en una respuesta previa. Da la dirección IP en lugar del nombre de host. --ips no disponibles 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

2
netstat -tapen | grep ssh | awk '{ print $4}'

no funciona en CentOS 6.9 (net-tools 1.60 netstat 1.42)(No info could be read for "-p": geteuid()=507 but you should be root.)
Jeff

@Jeff sudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'funciona?
Alexx Roche

2

Puede obtenerlo de manera 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;
}

1

netstat funcionará (en la parte superior algo como esto) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLECIDO


Muchas gracias por esta respuesta, terminé haciendo 'netstat | grep ssh '.
Ross Aiken

Por razones de seguridad, esto es malo porque cualquiera podría estar conectado a ese puerto, no solo usted.
CrazyCasta

1
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 otras cosas. Necesita más trabajo.


mi netstat solo da una dirección truncada para IPv6 y "127.0.0.1:22" es el servidor en lugar del cliente (que se especificó en la pregunta)
Alexx Roche

1

un hilo antiguo con muchas respuestas, pero ninguna es exactamente lo que estaba buscando, así que estoy aportando la mía

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 sudo y sesiones de pantalla. rastreará a través del árbol de procesos hasta que encuentre un pid con la variable SSH_CLIENT, luego registrará su IP como $ sshClientIP. Si llega demasiado lejos en el árbol, registrará la IP como 'localhost' y dejará el bucle.


0

Por lo general, hay una entrada de registro en / var / log / messages (o similar, dependiendo de su sistema operativo) que puede utilizar con el nombre de usuario.


0

Linux: ¿quién soy yo | awk '{print $ 5}' | sed 's / [()] // g'

AIX: quien soy yo | awk '{print $ 6}' | sed 's / [()] // g'


0

Busque conexiones SSH para la cuenta "myusername";

Tome la cadena del primer resultado;

Toma la quinta columna;

Dividir por ":" y devolver la primera parte (el número de puerto no es necesario, solo queremos IP):

netstat -tapen | grep "sshd: myusername" | cabeza -n1 | awk '{split ($ 5, a, ":"); imprime un [1]} '


De otra manera:

quien soy yo | awk '{l = longitud ($ 5) - 2; print substr ($ 5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'dice que mi cliente ssh es de 2a02y su "Otra forma:" dicetmux(2445).%3
Alexx Roche


0

Un pulgar hacia arriba por la respuesta de @Nikhil Katre:

El comando más simple para que los últimos 10 usuarios inicien sesión en la máquina es last|head.

Para obtener todos los usuarios, simplemente use el lastcomando

El que usa whoo pinkyhizo lo que básicamente se le pide. Pero Pero Pero no dan información de sesiones históricas.

Lo que también puede ser interesante si desea conocer a alguien que acaba de iniciar sesión y que ya se desconectó cuando comienza esta comprobación.

si es un sistema multiusuario Recomiendo agregar la cuenta de usuario que está buscando:

last | grep $USER | head

EDITAR:

En mi caso, tanto $ SSH_CLIENT como $ SSH_CONNECTION no existen.


0

El comando más simple para que los últimos 10 usuarios inicien sesión en la máquina es last|head. Para obtener todos los usuarios, simplemente use el lastcomando


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.