Trova l'indirizzo IP del client in una sessione SSH


166

Ho uno script che deve essere eseguito da una persona che accede al server con SSH .

C'è un modo per scoprire automaticamente da quale indirizzo IP l'utente si sta connettendo?

Certo, potrei chiedere all'utente (è uno strumento per programmatori, quindi nessun problema con quello), ma sarebbe più bello se lo scoprissi.


5
propone di passare a serverfault, comunque una grande domanda
BozoJoe,

Risposte:


267

Controlla se esiste una variabile d'ambiente chiamata:

$SSH_CLIENT 

O

$SSH_CONNECTION

(o qualsiasi altra variabile d'ambiente) che viene impostata quando l'utente accede. Quindi elaborarlo utilizzando lo script di accesso dell'utente.

Estrai l'IP:

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

@cwd voglio sostituire l'ip con questo comando "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" è possibile?
wutzebaer,

2
Questo è stato REMOTEHOST per me.
drammatico

5
Funziona solo con utenti non sudoed. ad esempio, se si dispone di un utente SSH e quindi si esegue l'escalation alla radice, viene creata una nuova shell e queste variabili vengono perse, a meno che non sia possibile risalire attraverso l'albero per trovare il pid SSH originale e ottenere le variabili da / proc / $ PID / environment
Andrej

5
grazie a stackoverflow.com/questions/428109/extract-substring-in-bash questa risposta può essere migliorata semplicemente${SSH_CLIENT%% *}
Jeff

@Andrej guarda dentrosudo -E
Jeff

105

È possibile utilizzare il comando:

server:~# pinky

che ti darà qualcosa del genere:

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133

13
È fantastico :-) Umorismo da nerd ftw ancora una volta. Secondo pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods,

Perché il mio 'Where' nel mio output mostra solo il nome della macchina e non l'indirizzo IP?
Isaganiesteron,

Probabilmente hai il nameserver configurato nella tua macchina.
vncprado,

pinky mostrerà tutti gli utenti che hanno effettuato l'accesso, non solo te stesso
Andrej

33

Prova quanto segue per ottenere solo l'indirizzo IP:

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

abbastanza sicuro se scrivi whoami e otterrai il nome dell'utente che ha effettuato l'accesso. non c'è quinta cosa o ip da stampare scusa. ma whoami è un comando utile
gerard

15
who am i! = whoamialmeno sul mio Linux. C'è una quinta cosa ed è il nome host del client.
Kbulgrien,

5
Per chiunque altro chiedendo circa who am i: La pagina del manuale per la whodice: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Quindi funziona davvero qualsiasi cosa con due parole, anche cose del genere who likes icecream.
jmiserez,

3
Basandomi su questa risposta, l'ho ridotta in who -m --ips|awk '{print $5}'modo da avere solo IP e nessuna risposta inversa. Grazie per l'aiuto who am i!
Yvan,

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

19

Digita il seguente comando sul tuo computer 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

Uso questo per determinare la mia variabile DISPLAY per la sessione quando eseguo l'accesso tramite ssh e devo visualizzare X remoto.


Utile un liner per aggiungere il mio IP ai file .htaccess. Grazie. Ho fatto una modifica per FreeBSD: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' l'ultima parte sfugge ai punti.
Olivier - interfaSys,

5

Migliorare su una risposta precedente. Fornisce l'indirizzo IP anziché il nome host. --ips non disponibile su OS X.

who am i --ips|awk '{print $5}' #ubuntu 14

più universale, cambia da $ 5 a $ 6 per 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}'

non funziona su 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$'funziona?
Alexx Roche,

2

Puoi ottenerlo in modo programmatico tramite una libreria 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 funzionerà (in alto qualcosa del genere) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 STABILITO


Grazie mille per questa risposta, ho finito per fare 'netstat | grep ssh '.
Ross Aiken,

Per motivi di sicurezza questo è negativo perché chiunque potrebbe essere collegato a quella porta, non solo tu.
CrazyCasta,

1
netstat -tapen | grep ssh | awk '{ print $10}'

Produzione:

due # nel mio esperimento

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

fornisce l'indirizzo IP.

Produzione:

127.0.0.1:22 # in my experiment

Ma i risultati sono mescolati con altri utenti e cose del genere. Ha bisogno di più lavoro.


il mio netstat fornisce solo un indirizzo troncato per IPv6 e "127.0.0.1:22" è il server anziché il client, (che è stato specificato nella domanda.)
Alexx Roche,

1

un thread più vecchio con molte risposte, ma nessuna è proprio quello che stavo cercando, quindi sto contribuendo con la mia:

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

questo metodo è compatibile con utenti diretti ssh, sudoed e sessioni schermo. scorrerà attraverso l'albero dei processi fino a quando non trova un pid con la variabile SSH_CLIENT, quindi registra il suo IP come $ sshClientIP. se si avvicina troppo all'albero, registrerà l'IP come 'localhost' e lascerà il ciclo.


0

Di solito c'è una voce di registro in / var / log / messages (o simile, a seconda del sistema operativo in uso) che è possibile utilizzare con il nome utente.


0

Linux: chi sono | awk '{print $ 5}' | sed 's / [()] // g'

AIX: chi sono | awk '{print $ 6}' | sed 's / [()] // g'


0

Cerca connessioni SSH per l'account "myusername";

Prendi la prima stringa del risultato;

Prendi la 5a colonna;

Dividi per ":" e ritorna la prima parte (il numero di porta non è necessario, vogliamo solo IP):

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


Un altro modo:

chi sono | awk '{l = lunghezza ($ 5) - 2; substr stampa ($ 5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'dice che il mio client SSH è 2a02e il tuo "Un altro modo:" dicetmux(2445).%3
Alexx Roche,


0

Un pollice in su per la risposta di @Nikhil Katre:

Il comando più semplice per ottenere gli ultimi 10 utenti connessi alla macchina è last|head.

Per ottenere tutti gli utenti basta usare il lastcomando

Quello che usa whoo ha pinkyfatto ciò che è sostanzialmente chiesto. Ma Ma Ma non danno informazioni sulle sessioni storiche.

Il che potrebbe anche essere interessante se si desidera conoscere qualcuno che ha appena effettuato l'accesso e si è disconnesso già quando si avvia questo controllo.

se si tratta di un sistema multiutente. Consiglio di aggiungere l'account utente che stai cercando:

last | grep $USER | head

MODIFICARE:

Nel mio caso, non esistono sia $ SSH_CLIENT che $ SSH_CONNECTION.


0

Il comando più semplice per ottenere gli ultimi 10 utenti connessi alla macchina è last|head. Per ottenere tutti gli utenti, basta usare il lastcomando


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.