Ich habe ein Skript, das von einer Person ausgeführt werden soll, die sich mit SSH am Server anmeldet.
Gibt es eine Möglichkeit, automatisch herauszufinden, von welcher IP-Adresse sich der Benutzer verbindet?
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 gerade herausfinden würde.
Prüfen Sie, ob es eine Umgebungsvariable gibt:
$SSH_CLIENT
OR
$SSH_CONNECTION
(oder andere Umgebungsvariablen), die bei der Anmeldung des Benutzers festgelegt wird. Verarbeiten Sie sie dann mit dem Benutzeranmeldeskript.
Extrahieren Sie die IP:
$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4
Sie könnten den 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
Versuchen Sie Folgendes, um nur die IP-Adresse zu erhalten:
who am i|awk '{ print $5}'
Geben Sie einfach den folgenden Befehl auf Ihrem Linux-Rechner ein:
who
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 ermitteln, wenn ich mich über ssh anmelde und Remote X anzeigen muss.
Verbesserung einer früheren Antwort Gibt eine IP-Adresse anstelle des Hostnamens an. --ips nicht verfügbar unter OS X.
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
Sie können es programmgesteuert über eine SSH-Bibliothek erhalten ( 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;
}
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
Die Ergebnisse sind jedoch mit anderen Benutzern und anderen Dingen gemischt. Es braucht mehr Arbeit.
netstat -tapen | grep ssh | awk '{ print $4}'
Suchen Sie nach SSH-Verbindungen für das Konto "myusername".
Nimm die erste Ergebniszeichenfolge.
Nimm die fünfte Spalte.
Nach ":" aufteilen und 1. Teil zurückschicken (Portnummer wird nicht benötigt, wir wollen nur IP):
netstat -tapen | grep "sshd: myusername" | head -n1 | awk '{split ($ 5, a, ":"); Drucke ein [1]} '
Ein anderer Weg:
wer bin ich | awk '{l = Länge ($ 5) - 2; Drucke substr ($ 5, 2, l)} '
Linux: wer bin ich | awk '{print $ 5}' | sed 's/[()] // g'
AIX: wer bin ich | awk '{print $ 6}' | sed 's/[()] // g'
netstat wird funktionieren (oben ungefähr so) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED
who | cut -d"(" -f2 |cut -d")" -f1
Einen Daumen hoch für die Antwort von @Nikhil Katre:
Der einfachste Befehl zum Abrufen der letzten 10 am Computer angemeldeten Benutzer ist
last|head
.Um alle Benutzer zu erhalten, verwenden Sie einfach den Befehl
last
Derjenige, der who
oder pinky
verwendet, hat das getan, was grundsätzlich gefragt wird. Aber sie geben aber keine Informationen zu historischen Sitzungen.
Das könnte auch interessant sein, wenn Sie jemanden kennen möchten, der sich gerade angemeldet hat und Bereits abgemeldet ist, wenn Sie diese Prüfung starten.
wenn es ein Mehrbenutzersystem ist. Ich empfehle, das gewünschte Benutzerkonto hinzuzufügen:
last | grep $USER | head
BEARBEITEN:
In meinem Fall sind sowohl $ SSH_CLIENT als auch $ SSH_CONNECTION nicht vorhanden.
Der einfachste Befehl zum Abrufen der letzten 10 am Computer angemeldeten Benutzer ist
last|head
.Um alle Benutzer zu erhalten, verwenden Sie einfach den Befehl
last
Normalerweise gibt es einen Protokolleintrag in/var/log/messages (oder ähnlich, je nach Betriebssystem), den Sie mit dem Benutzernamen abrufen können.
Angenommen, er eröffnet eine interaktive Sitzung (dh weist ein Pseudo-Terminal zu) und Sie haben Zugriff auf stdin. Sie können ein ioctl auf diesem Gerät aufrufen , um die Gerätenummer (/ dev/pts/4711) zu erhalten ) und versuchen Sie, dieses in /var/run/utmp zu finden (wo auch der Benutzername und die IP-Adresse stehen, von der die Verbindung stammt).
ein älterer Thread mit vielen Antworten, aber keiner ist genau das, wonach ich gesucht habe.
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 mit direkten SSH-, Sudoed-Benutzern und Bildschirmsitzungen kompatibel. Es wird durch den Prozessbaum geführt, bis es eine PID mit der SSH_CLIENT-Variablen findet. Anschließend wird seine IP als $ sshClientIP aufgezeichnet. Wenn es zu weit oben in der Baumstruktur erscheint, wird die IP als 'localhost' aufgezeichnet und die Schleife verlassen.