Bir SSH oturumunda istemcinin IP adresini bulun


166

SSH ile sunucuya oturum açan bir kişi tarafından çalıştırılacak bir komut dosyası var .

Kullanıcının hangi IP adresinden bağlandığını otomatik olarak öğrenmenin bir yolu var mı?

Tabii ki, kullanıcıya sorabilirsiniz (bu programcılar için bir araçtır, bu yüzden sorun yok), ama yeni öğrendim, daha serin olurdu.


5
yine de büyük soru serverfault, taşıma önermek
BozoJoe

Yanıtlar:


267

Bir ortam değişkeni olup olmadığını kontrol edin:

$SSH_CLIENT 

VEYA

$SSH_CONNECTION

(veya diğer ortam değişkenleri) kullanıcı oturum açtığında ayarlanır. Ardından kullanıcı oturum açma komut dosyasını kullanarak işleyin.

IP'yi çıkarın:

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

@cwd "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" komutundaki ipi değiştirmek istiyorum.
wutzebaer

2
Bu benim için UZAKTAN oldu.
16'da dramatik

5
yalnızca sudo olmayan kullanıcılarla çalışır. Örneğin, bir ssh kullanıcınız varsa ve sonra kök dizinine yükselirseniz, yeni bir kabuk oluşturulur ve orijinal ssh pid'ini bulmak ve / proc / $ PID / environ'tan değişkenleri almak için ağaçtan geriye doğru izleyemezseniz bu değişkenler kaybolur.
Andrej

5
stackoverflow.com/questions/428109/extract-substring-in-bash sayesinde bu cevap basitçe geliştirilebilir${SSH_CLIENT%% *}
Jeff

@Andrej içine bakmaksudo -E
Jeff

105

Komutu kullanabilirsiniz:

server:~# pinky

size böyle bir şey verecek:

Login      Name                 TTY    Idle   When                 Where 

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

13
Bu harika :-) Nerd mizah ftw bir kez daha. Göre pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods

Çıktımdaki 'Nerede' neden ip adresini değil sadece makine adını gösteriyor?
isaganiesteron

Muhtemelen ad sunucunuzda yapılandırılmış.
vncprado

pinky sadece kendiniz değil, tüm giriş yapmış kullanıcıları gösterecektir
Andrej

33

Yalnızca IP adresini almak için aşağıdakileri deneyin:

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

whoami yazarsanız ve giriş yapmış kullanıcının adını alırsanız oldukça emin olun. üzgünüm yazdırmak için beşinci bir şey veya ip yok. ama whoami yararlı bir komuttur
gerard

15
who am i! = whoamien azından Linux'umda. Beşinci bir şey var ve istemcinin ana bilgisayar adı.
kbulgrien

5
Merak başkası için who am i: manpage için whodiyor ki: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Yani gerçekten iki kelimeli her şey işe yarıyor, aynı şey gibi who likes icecream.
jmiserez

3
Bu cevaba who -m --ips|awk '{print $5}'dayanarak, sadece IP ve ters dns cevabım olmayacak şekilde düşürdüm. Yardımınız için teşekkürler who am i!
Yvan

1
TMux ile başarısız: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche

19

Linux makinenize aşağıdaki komutu yazmanız yeterlidir:

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

Bunu ssh ile oturum açarken oturum için DISPLAY değişkenimi belirlemek için kullanıyorum ve uzak X'u görüntülemem gerekiyor.


IP adresimi .htaccess dosyalarına eklemek için kullanışlı bir astar. Teşekkür ederim. FreeBSD için bir değişiklik yaptım: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' Son bölüm noktalardan kaçıyor.
Olivier - interfaSys

5

Bir önceki cevapta iyileştirme. Ana bilgisayar adı yerine ip adresi verir. --ips OS X'te mevcut değildir.

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

daha evrensel, OS X 10.11 için 5 $ 'dan 6 $' a değiştirin:

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

CentOS 6.9 üzerinde çalışmaz (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$'işe yarıyor mu?
Alexx Roche

2

SSH kütüphanesi aracılığıyla programlı bir şekilde edinebilirsiniz ( 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 çalışacaktır (en üstte böyle bir şey) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 KURULDU


Bu cevap için çok teşekkür ederim, sonunda 'netstat | grep ssh '.
Ross Aiken

Güvenlik nedeniyle bu kötü bir durumdur çünkü sadece siz değil, herhangi biri bu bağlantı noktasına bağlanabilir.
CrazyCasta

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

Çıktı:

denememde iki #

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

IP adresini verir.

Çıktı:

127.0.0.1:22 # in my experiment

Ancak sonuçlar diğer kullanıcılarla ve şeylerle karıştırılır. Daha fazla çalışmaya ihtiyacı var.


benim netstat sadece IPv6 için kesilmiş bir adres veriyor ve "127.0.0.1:22" istemci yerine sunucu (soruda belirtildi.)
Alexx Roche

1

cevapları çok eski bir iplik, ama hiçbiri ben ne aradığını oldukça, bu yüzden benim katkıda bulunuyorum:

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

bu yöntem doğrudan ssh, sudoed kullanıcıları ve ekran oturumlarıyla uyumludur. SSH_CLIENT değişkeni ile bir pid bulana kadar işlem ağacında ilerler ve ardından IP'sini $ sshClientIP olarak kaydeder. ağaca çok yaklaşırsa, IP'yi 'localhost' olarak kaydedecek ve döngüden ayrılacaktır.


0

Genellikle / var / log / messages dizininde (veya işletim sisteminize bağlı olarak benzer) bir kullanıcı adı ile grep edebileceğiniz bir günlük girişi vardır.


0

Linux: ben kimim | awk '{5 $ yazdır}' | sed 's / [()] // g'

AIX: ben kimim | awk '{6 $ yazdır}' | sed 's / [()] // g'


0

"Myusername" hesabı için SSH bağlantılarını arayın;

İlk sonuç dizesini al;

5. sütunu al;

":" İle bölün ve 1. kısmı döndürün (port numarası gerekmez, sadece IP istiyoruz):

netstat -tapen | grep "sshd: kullanıcı adı" | kafa -n1 | awk '{split (5 $, a, ":"); bir [1]} 'yazdır


Diğer yol:

ben kimim | awk '{l = uzunluk (5 $) - 2; substr'yi yazdır (5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'ssh istemcim olduğunu 2a02ve "Başka bir yol" diyor diyortmux(2445).%3
Alexx Roche


0

@Nikhil Katre'in cevabı için bir başparmak yukarı:

Makineye giriş yapan son 10 kullanıcıyı almak için en basit komut last|head .

Tüm kullanıcıları almak için sadece lastkomutu kullan

whoVeya kullananpinky temelde sorulan şeyi yaptı. Ama Ama Ama tarihsel oturumlar bilgi vermiyorlar.

Bu denetime başladığınızda henüz giriş yapmış ve oturumu kapatmış birini tanımak istiyorsanız da ilginç olabilir.

çok kullanıcılı bir sistem ise. Aradığınız kullanıcı hesabını eklemenizi tavsiye ederim:

last | grep $USER | head

DÜZENLE:

Benim durumumda, hem $ SSH_CLIENT hem de $ SSH_CONNECTION mevcut değil.


0

Makineye giriş yapan son 10 kullanıcıyı almak için en basit komut last|head. Tüm kullanıcıları almak için lastkomutunu kullanmanız yeterlidir


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.