Znajdź adres IP klienta w sesji SSH

166

Mam skrypt, który ma być uruchomiony przez osobę logującą się do serwera za pomocą SSH .

Czy istnieje sposób, aby automatycznie dowiedzieć się, z jakiego adresu IP łączy się użytkownik?

Oczywiście mógłbym zapytać użytkownika (jest to narzędzie dla programistów, więc nie ma z tym problemu), ale fajniej by było, gdybym się o tym dowiedział.

Lecieć jak po sznurku
źródło
5
proponuję przejście na
błąd serwera

Odpowiedzi:

267

Sprawdź, czy istnieje zmienna środowiskowa o nazwie:

$SSH_CLIENT 

LUB

$SSH_CONNECTION

(lub dowolne inne zmienne środowiskowe), które są ustawiane, gdy użytkownik loguje się. Następnie przetwórz to za pomocą skryptu logowania użytkownika.

Wyodrębnij adres IP:

$ echo $SSH_CLIENT | awk '{ print $1}'
1.2.3.4
$ echo $SSH_CONNECTION | awk '{print $1}'
1.2.3.4
nolim1t
źródło
@cwd Chcę zamienić IP w tym poleceniu "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" czy to możliwe?
wutzebaer
2
To był dla mnie REMOTEHOST.
dramatyczny 07.07.16
5
działa tylko z użytkownikami bez sudo. np. jeśli masz użytkownika ssh, a następnie eskalujesz do roota, tworzona jest nowa powłoka i te zmienne są tracone, chyba że możesz prześledzić drzewo, aby znaleźć oryginalny identyfikator ssh i uzyskać zmienne z / proc / $ PID / environment
Andrej
5
dzięki stackoverflow.com/questions/428109/extract-substring-in-bash tę odpowiedź można poprawić w prosty sposób${SSH_CLIENT%% *}
Jeff
@Andrej look intosudo -E
Jeff
105

Możesz użyć polecenia:

server:~# pinky

co da ci coś takiego:

Login      Name                 TTY    Idle   When                 Where 

root       root                 pts/0         2009-06-15 13:41     192.168.1.133
vncprado
źródło
13
To niesamowite :-) Nerd humor ftw jeszcze raz. Według pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods,
Dlaczego moje „Gdzie” w moich wynikach pokazuje tylko nazwę komputera, a nie adres IP?
isaganiesteron
Prawdopodobnie masz skonfigurowany serwer nazw na swoim komputerze.
vncprado
pinky pokaże wszystkich zalogowanych użytkowników, nie tylko Ciebie
Andrej
33

Spróbuj wykonać następujące czynności, aby uzyskać tylko adres IP:

who am i|awk '{ print $5}'
AlexP
źródło
całkiem pewny, jeśli napiszesz whoami, a otrzymasz nazwę zalogowanego użytkownika. nie ma piątej rzeczy ani adresu IP do wydrukowania, przepraszam. ale whoami jest przydatnym poleceniem
gerard
15
who am i! = whoamiprzynajmniej na moim Linuksie. Jest piąta sprawa, a jest to nazwa hosta klienta.
kbulgrien
5
Dla każdego innego zastanawiać who am i: manpage dla whomówi: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Tak naprawdę wszystko, co zawiera dwa słowa, działa, także takie jak who likes icecream.
jmiserez
3
Opierając się na tej odpowiedzi, zredukowałem ją do who -m --ips|awk '{print $5}'tak, że miałem tylko adres IP i brak odpowiedzi odwrotnego dns. Dzięki za pomoc who am i!
Yvan
1
Niepowodzenie z tmux: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche
19

Po prostu wpisz następujące polecenie na komputerze z systemem Linux:

who
Bangar
źródło
6
 who | cut -d"(" -f2 |cut -d")" -f1
danilo
źródło
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

Używam tego do określenia mojej zmiennej DISPLAY dla sesji, gdy loguję się przez ssh i muszę wyświetlić zdalne X.

Spindrift
źródło
Przydatna jedna linijka do dodawania mojego adresu IP do plików .htaccess. Dziękuję Ci. Zrobiłem modyfikację dla FreeBSD: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' ostatnia część wymyka się kropkom.
Olivier - interfaSys
5

Poprawa wcześniejszej odpowiedzi. Podaje adres IP zamiast nazwy hosta. --ips niedostępne w systemie OS X.

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

bardziej uniwersalny, zmień 5 USD na 6 USD dla 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
źródło
2
netstat -tapen | grep ssh | awk '{ print $4}'
Sébastien Moreau
źródło
nie działa na 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$'działa?
Alexx Roche,
2

Możesz to uzyskać w sposób programowy za pośrednictwem biblioteki 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;
}
vinetv2821993
źródło
1

netstat będzie działał (u góry coś takiego) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED

aric
źródło
Dziękuję bardzo za tę odpowiedź, skończyło się na zrobieniu 'netstat | grep ssh '.
Ross Aiken,
Ze względów bezpieczeństwa jest to złe, ponieważ każdy może być podłączony do tego portu, nie tylko Ty.
CrazyCasta,
1
netstat -tapen | grep ssh | awk '{ print $10}'

Wynik:

dwa # w moim eksperymencie

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

podaje adres IP.

Wynik:

127.0.0.1:22 # in my experiment

Ale wyniki są mieszane z innymi użytkownikami i rzeczami. Potrzebuje więcej pracy.

Gerard
źródło
mój netstat podaje tylko obcięty adres dla IPv6, a „127.0.0.1:22” to serwer, a nie klient (co zostało określone w pytaniu).
Alexx Roche
1

starszy wątek z wieloma odpowiedziami, ale żadna nie jest tym, czego szukałem, więc piszę mój:

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

ta metoda jest kompatybilna z bezpośrednim ssh, użytkownikami sudoed i sesjami screen. będzie przechodzić przez drzewo procesów, aż znajdzie pid ze zmienną SSH_CLIENT, a następnie zarejestruje swój adres IP jako $ sshClientIP. jeśli znajdzie się za wysoko w drzewie, zapisze IP jako „localhost” i opuści pętlę.

Andrej
źródło
0

Zwykle w / var / log / messages (lub podobnym, w zależności od systemu operacyjnego) znajduje się wpis dziennika, który można grepować za pomocą nazwy użytkownika.

Daniel Schneller
źródło
0

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

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

pfrandsen
źródło
0

Wyszukaj połączenia SSH dla konta „myusername”;

Weź pierwszy ciąg wynikowy;

Weź piątą kolumnę;

Podziel według ":" i zwróć pierwszą część (numer portu nie jest potrzebny, chcemy tylko IP):

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


Inny sposób:

kim jestem | awk '{l = length (5 $) - 2; print substr (5 $, 2, l)} '

Nex
źródło
sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'mówi, że mój klient ssh jest z, 2a02a twoja „Inna droga” mówitmux(2445).%3
Alexx Roche
0

Zakładając, że otworzy sesję interaktywną (to znaczy przydzieli pseudoterminal ) i masz dostęp do stdin, możesz wywołać ioctl na tym urządzeniu, aby uzyskać numer urządzenia (/ dev / pts / 4711) i spróbować znaleźć to w / var / run / utmp (gdzie będzie również nazwa użytkownika i adres IP, z którego pochodzi połączenie).

mihi
źródło
0

Jeden kciuk w górę za odpowiedź @Nikhil Katre:

Najprostszym poleceniem, aby pobrać ostatnich 10 użytkowników zalogowanych do komputera, jest last|head .

Aby zdobyć wszystkich użytkowników, wystarczy użyć lastpolecenia

Ten, który używa wholubpinky zrobił to, o co w zasadzie proszono. Ale ale nie podają informacji o sesjach historycznych.

Co może być również interesujące, jeśli chcesz poznać kogoś, kto właśnie się zalogował i wylogował, kiedy zaczynasz sprawdzać.

jeśli jest to system wielu użytkowników. Polecam dodać konto użytkownika, którego szukasz:

last | grep $USER | head

EDYTOWAĆ:

W moim przypadku zarówno $ SSH_CLIENT, jak i $ SSH_CONNECTION nie istnieją.

Kangqiao Zhao
źródło
0

Najprostszym poleceniem, aby pobrać ostatnich 10 użytkowników zalogowanych do komputera, jest last|head. Aby zdobyć wszystkich użytkowników, po prostu użyj lastpolecenia

Nikhil Katre
źródło
0

Otrzymuję następujące dane wyjściowe z who -m --ipsDebiana 10:

root pts / 0 4 grudnia 06:45 123.123.123.123

Wygląda na to, że dodano nową kolumnę, więc próby {print $5}weź piątą kolumnę ” już nie działają.

Spróbuj tego:

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

Źródło:

aexl
źródło