2009-06-15 17 views
118

Ho uno script che deve essere eseguito da una persona che accede al server con SSH.Trova l'indirizzo IP del client in una sessione SSH

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

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

+2

propongono di trasferirsi a serverfault, ancora una grande domanda però – BozoJoe

risposta

191

Controllare se è una variabile di ambiente denominata:

$SSH_CLIENT 

O

$SSH_CONNECTION 

(o qualsiasi altra variabile) che viene impostato quando l'utente effettua poi elaborarla utilizzando l'utente. script di accesso.

Estrarre il IP:

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

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

+2

Questo era REMOTEHOST per me. – dramzy

+3

funziona solo con utenti non sudoed. per esempio. se si ha un utente ssh e poi si esegue l'escalation su root, viene creata una nuova shell e queste variabili vengono perse, a meno che non si riesca a risalire attraverso l'albero per trovare il psh ssh originale e ottenere le variabili da/proc/$ PID/environ – Andrej

0

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

0

Supponendo che apre una sessione interattiva (cioè, assegna un pseudo terminal) e si ha accesso a stdin, è possibile call an ioctl on that device per ottenere il numero del dispositivo (/ dev/pts/4711) e prova a trovarlo in /var/run/utmp (dove ci sarà anche il nome utente e l'indirizzo IP da cui è originata la connessione).

83

È possibile utilizzare il comando:

server:~# pinky 

che vi darà a voi somehting in questo modo:

Login  Name     TTY Idle When     Where 

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

È fantastico :-) Nerd humor ftw ancora una volta. Secondo 'pinky --help':' Un programma leggero 'dito'; stampare le informazioni dell'utente. Il file utmp sarà/var/run/utmp.' –

+0

Perché il mio 'Dove' nella mia uscita mostra solo il nome della macchina e non l'indirizzo IP? – isaganiesteron

+0

Probabilmente hai configurato il server dei nomi nella tua macchina. – vncprado

1

netstat funzionerà (in qualcosa di superiore come questo) tcp 0 0 10. x.xx.xx: ssh someipaddress.or.domainame: 9379 STABILITO

+0

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

+0

Per motivi di sicurezza questo è un problema perché chiunque può essere connesso a quella porta, non solo a te. – CrazyCasta

27

Prova le seguenti per ottenere solo l'indirizzo IP:

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

quasi sicuro se scrivi whoami e otterrai il nome dell'utente connesso. non c'è quinta cosa o ip da stampare mi dispiace. ma whoami è un comando utile – gerard

+13

'who am i'! =' whoami' sul mio Linux almeno. C'è una quinta cosa, ed è il nome host del client. – kbulgrien

+4

Per tutti gli altri che si interrogano su 'who am i': La manpage per' who' dice: 'Se ARG1 ARG2 è dato, -m presume: 'am i' o 'mom likes' sono normali. Quindi qualsiasi cosa con due parole funziona, anche cose come "A chi piace il gelato". – jmiserez

0

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

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

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

uscita:

due # nel mio esperimento

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

dà l'indirizzo IP.

uscita:

127.0.0.1:22 # in my experiment 

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

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 

Io lo uso per determinare il mio variabile DISPLAY per la sessione quando si accede via ssh e la necessità di visualizzare a distanza X.

+0

Utile una fodera per aggiungere il mio IP ai file .htaccess. Grazie. Ho apportato una modifica per FreeBSD: 'who am i | awk '{print $ 6}' | sed 's/[()] // g' | sed 's /./\\./ g'' L'ultima parte sfugge ai punti. –

2

Si può ottenere 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

Ricerca connessioni SSH per account "myusername";

Prendere la prima stringa di risultati;

Prendere la quinta colonna;

Split by ":" e tornare prima parte (numero di porta non aveva bisogno, vogliamo solo IP):

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


Un altro modo:

Chi sono io | awk '{l = length ($ 5) - 2; print substr ($ 5, 2, l)}'

13

Basta digitare il seguente comando sulla macchina Linux:

who 
3

Migliorare su una risposta precedente. Fornisce l'indirizzo ip al posto del nome host. --ips non disponibile su OS X.

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

più universale, modificare $ 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 
0

un thread di anziani con un sacco di risposte, ma nessuno è proprio quello che stava cercando, in modo da sto contribuendo miniera:

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 ssh diretta, gli utenti sudoed, e le sessioni di schermo. rimarrà attraverso l'albero del processo finché non troverà un pid con la variabile SSH_CLIENT, quindi registrerà il suo IP come $ sshClientIP. se si avvicina troppo alla struttura, registrerà l'IP come "localhost" e lascerà il ciclo.

0

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

Per ottenere tutti gli utenti è sufficiente utilizzare last comando

Problemi correlati