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.

flybywire
fuente
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
nolim1t
fuente
@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
vncprado
fuente
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}'
AlexP
fuente
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
Bangar
fuente
6
 who | cut -d"(" -f2 |cut -d")" -f1
danilo
fuente
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.

Rocío del mar
fuente
Ú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
SeeBenClick
fuente
2
netstat -tapen | grep ssh | awk '{ print $4}'
Sébastien Moreau
fuente
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;
}
vineetv2821993
fuente
1

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

aric
fuente
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.

gerard
fuente
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.

Andrej
fuente
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.

Daniel Schneller
fuente
0

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

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

pfrandsen
fuente
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)} '

Nex
fuente
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.

Kangqiao Zhao
fuente
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

Nikhil Katre
fuente
0

Estoy obteniendo el siguiente resultado de who -m --ipsDebian 10:

root pts / 0 dic 4 06:45 123.123.123.123

Parece que se agregó una nueva columna, por lo que los intentos de {print $5}" tomar la quinta columna " ya no funcionan.

Prueba esto:

who -m --ips | egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'

Fuente:

aexl
fuente