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ł.


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

@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

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}'

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


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.


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

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

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;
}

1

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


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.


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ę.


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.


0

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

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


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)} '


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

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ą.


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.