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.