Suchen Sie die IP-Adresse des Clients in einer SSH-Sitzung


166

Ich habe ein Skript, das von einer Person ausgeführt werden soll, die sich mit SSH beim Server anmeldet .

Gibt es eine Möglichkeit, automatisch herauszufinden, von welcher IP-Adresse der Benutzer eine Verbindung herstellt?

Natürlich könnte ich den Benutzer fragen (es ist ein Tool für Programmierer, also kein Problem damit), aber es wäre cooler, wenn ich es nur herausfinden würde.


5
Schlagen Sie vor, auf Serverfehler umzusteigen, aber immer noch eine gute Frage
BozoJoe

Antworten:


266

Überprüfen Sie, ob es eine Umgebungsvariable mit dem Namen gibt:

$SSH_CLIENT 

ODER

$SSH_CONNECTION

(oder andere Umgebungsvariablen), die festgelegt werden, wenn sich der Benutzer anmeldet. Verarbeiten Sie sie dann mithilfe des Benutzeranmeldeskripts.

IP extrahieren:

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

@cwd Ich möchte die IP in diesem Befehl ersetzen "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" ist das möglich?
Wutzebaer

2
Das war REMOTEHOST für mich.
Dramzy

5
funktioniert nur mit nicht sudoed Benutzern. Wenn Sie beispielsweise einen SSH-Benutzer haben und dann zu Root eskalieren, wird eine neue Shell erstellt und diese Variablen gehen verloren, es sei denn, Sie können durch den Baum zurückverfolgen, um die ursprüngliche SSH-PID zu finden und die Variablen aus / proc / $ PID / environ abzurufen
Andrej

5
Dank stackoverflow.com/questions/428109/extract-substring-in-bash kann diese Antwort einfach verbessert werden${SSH_CLIENT%% *}
Jeff

@ Andrej schauen insudo -E
Jeff

105

Sie könnten den folgenden Befehl verwenden:

server:~# pinky

das wird dir so etwas geben:

Login      Name                 TTY    Idle   When                 Where 

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

13
Das ist großartig :-) Nerd Humor ftw noch einmal. Laut pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods

Warum zeigt mein 'Wo' in meiner Ausgabe nur den Computernamen und nicht die IP-Adresse an?
Isaganiesteron

Wahrscheinlich haben Sie den Nameserver auf Ihrem Computer konfiguriert.
vncprado

pinky zeigt alle angemeldeten Benutzer, nicht nur Sie selbst
Andrej

33

Versuchen Sie Folgendes, um nur die IP-Adresse zu erhalten:

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

Ich bin mir ziemlich sicher, wenn Sie whoami schreiben und den Namen des angemeldeten Benutzers erhalten. Es gibt keine fünfte Sache oder IP zu drucken, sorry. aber whoami ist ein nützlicher Befehl
gerard

15
who am i! = whoamizumindest unter Linux. Es gibt eine fünfte Sache, und es ist der Hostname des Clients.
kbulgrien

5
Für alle anderen, die sich fragen who am i: Die Manpage für whosagt : If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Also funktioniert wirklich alles mit zwei Wörtern, auch Dinge wie who likes icecream.
jmiserez

3
Aufbauend auf dieser Antwort habe ich sie who -m --ips|awk '{print $5}'so reduziert, dass ich nur IP und keine Reverse-DNS-Antwort hatte. Danke für die Hilfe weiter who am i!
Yvan

1
Schlägt mit tmux fehl: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche

19

Geben Sie einfach den folgenden Befehl auf Ihrem Linux-Computer ein:

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

Ich benutze dies, um meine DISPLAY-Variable für die Sitzung zu bestimmen, wenn ich mich über ssh anmelde und Remote X anzeigen muss.


Nützlicher Einzeiler, um meine IP zu .htaccess-Dateien hinzuzufügen. Danke dir. Ich habe eine Modifikation für FreeBSD vorgenommen: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' Der letzte Teil entgeht den Punkten.
Olivier - interfaSys

5

Eine vorherige Antwort verbessern. Gibt die IP-Adresse anstelle des Hostnamens an. --ips unter OS X nicht verfügbar.

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

universeller, ändern Sie $ 5 in $ 6 für 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}'

funktioniert nicht unter 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 funktioniert sudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'?
Alexx Roche

2

Sie können es programmgesteuert über eine SSH-Bibliothek ( https://code.google.com/p/sshxcute ) abrufen.

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 funktioniert (oben ungefähr so) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED


Vielen Dank für diese Antwort. Am Ende habe ich 'netstat | gemacht grep ssh '.
Ross Aiken

Aus Sicherheitsgründen ist dies schlecht, da jeder an diesen Port angeschlossen werden kann, nicht nur Sie.
CrazyCasta

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

Ausgabe:

zwei # in meinem Experiment

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

gibt die IP-Adresse an.

Ausgabe:

127.0.0.1:22 # in my experiment

Aber die Ergebnisse sind gemischt mit anderen Benutzern und Sachen. Es braucht mehr Arbeit.


Mein Netstat gibt nur eine abgeschnittene Adresse für IPv6 an und "127.0.0.1:22" ist eher der Server als der Client (was in der Frage angegeben wurde)
Alexx Roche

1

Ein älterer Thread mit vielen Antworten, aber keiner ist genau das, wonach ich gesucht habe, also trage ich meinen bei:

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

Diese Methode ist kompatibel mit direkten SSH-, Sudoed-Benutzern und Bildschirmsitzungen. Es wird den Prozessbaum durchlaufen, bis es eine PID mit der Variablen SSH_CLIENT findet, und dann seine IP als $ sshClientIP aufzeichnen. Wenn es zu weit oben im Baum ist, zeichnet es die IP als 'localhost' auf und verlässt die Schleife.


0

Normalerweise gibt es einen Protokolleintrag in / var / log / messages (oder ähnlich, abhängig von Ihrem Betriebssystem), den Sie mit dem Benutzernamen abrufen können.


0

Linux: wer bin ich | awk '{print $ 5}' | sed 's / [()] // g'

AIX: wer bin ich | awk '{print $ 6}' | sed 's / [()] // g'


0

Suchen Sie nach SSH-Verbindungen für das Konto "myusername".

Nehmen Sie die erste Ergebniszeichenfolge.

Nehmen Sie die 5. Spalte;

Geteilt durch ":" und Rückgabe des 1. Teils (Portnummer nicht erforderlich, wir wollen nur IP):

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


Ein anderer Weg:

wer bin ich | awk '{l = Länge ($ 5) - 2; print substr ($ 5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'sagt, mein SSH-Kunde ist von 2a02und Ihr "Ein anderer Weg:" sagttmux(2445).%3
Alexx Roche


0

Ein Daumen hoch für die Antwort von @Nikhil Katre:

Der einfachste Befehl, um die letzten 10 Benutzer am Computer anzumelden, ist last|head.

Um alle Benutzer zu erhalten, verwenden Sie einfach den lastBefehl

Derjenige, der verwendet whooder pinkygetan hat, was grundsätzlich gefragt wird. Aber sie geben keine historischen Sitzungsinformationen.

Dies könnte auch interessant sein, wenn Sie jemanden kennenlernen möchten, der sich gerade angemeldet und abgemeldet hat, als Sie mit dieser Überprüfung beginnen.

wenn es sich um ein Mehrbenutzersystem handelt. Ich empfehle, das gesuchte Benutzerkonto hinzuzufügen:

last | grep $USER | head

BEARBEITEN:

In meinem Fall existieren sowohl $ SSH_CLIENT als auch $ SSH_CONNECTION nicht.


0

Der einfachste Befehl, um die letzten 10 Benutzer am Computer anzumelden, ist last|head. Verwenden Sie einfach den lastBefehl, um alle Benutzer abzurufen


0

Ich erhalte die folgende Ausgabe von who -m --ipsDebian 10:

root pts / 0 Dec 4 06:45 123.123.123.123

Sieht aus wie eine neue Spalte hinzugefügt, so {print $5}oder „ fünfte Kolonne nehmen “ Versuchen nicht mehr funktionieren.

Versuche dies:

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

Quelle:

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.