Temukan alamat IP klien dalam sesi SSH


166

Saya memiliki skrip yang harus dijalankan oleh orang yang masuk ke server dengan SSH .

Apakah ada cara untuk mencari tahu secara otomatis alamat IP mana yang disambungkan pengguna?

Tentu saja, saya bisa bertanya kepada pengguna (ini adalah alat untuk programmer, jadi tidak ada masalah dengan itu), tetapi akan lebih keren jika saya baru tahu.


5
mengusulkan pindah ke serverfault, masih pertanyaan besar
BozoJoe

Jawaban:


267

Periksa apakah ada variabel lingkungan bernama:

$SSH_CLIENT 

ATAU

$SSH_CONNECTION

(atau variabel lingkungan lainnya) yang akan disetel saat pengguna masuk. Lalu memprosesnya menggunakan skrip login pengguna.

Ekstrak IP:

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

@ cwd saya ingin mengganti ip dalam perintah ini "iptables -A INPUT -s 93.203.118.251 -p tcp --destination-port 443 -j DROP" apakah itu mungkin?
wutzebaer

2
Ini adalah REMOTEHOST untuk saya.
dramzy

5
hanya bekerja dengan pengguna yang tidak sudoed. mis. jika Anda memiliki pengguna ssh dan kemudian meningkat ke root, shell baru dibuat dan variabel-variabel ini hilang, kecuali Anda dapat melacak kembali melalui pohon untuk menemukan ssh pid asli dan mendapatkan variabel dari / proc / $ PID / environment
Andrej

5
terima kasih kepada stackoverflow.com/questions/428109/extract-substring-in-bash jawaban ini dapat ditingkatkan menjadi cukup${SSH_CLIENT%% *}
Jeff

@Andrej melihat kesudo -E
Jeff

105

Anda bisa menggunakan perintah:

server:~# pinky

yang akan memberi Anda beberapa hal seperti ini:

Login      Name                 TTY    Idle   When                 Where 

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

13
Itu luar biasa :-) Nerd humor sekali lagi. Menurut pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods

Mengapa 'Di mana' di output saya hanya menunjukkan nama mesin dan bukan alamat ip?
isaganiesteron

Mungkin Anda mendapatkan nameserver yang dikonfigurasi di mesin Anda.
vncprado

pinky akan menampilkan semua pengguna yang masuk, bukan hanya diri Anda sendiri
Andrej

33

Coba yang berikut ini untuk mendapatkan alamat IP:

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

cukup yakin jika Anda menulis whoami dan Anda akan mendapatkan nama pengguna yang masuk. tidak ada hal kelima atau ip untuk mencetak maaf. tapi whoami adalah perintah yang berguna
gerard

15
who am i! = whoamidi Linux saya setidaknya. Ada hal kelima, dan itu adalah nama host klien.
kbulgrien

5
Untuk orang lain bertanya-tanya tentang who am i: manualnya The untuk whomengatakan: If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Jadi benar-benar apa pun dengan dua kata berfungsi, juga hal-hal seperti who likes icecream.
jmiserez

3
Membangun jawaban ini, saya menguranginya who -m --ips|awk '{print $5}'sehingga saya hanya memiliki IP dan tidak ada jawaban reverse-dns. Terima kasih atas bantuannya who am i!
Yvan

1
Gagal dengan tmux: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche

19

Cukup ketik perintah berikut di mesin Linux Anda:

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

Saya menggunakan ini untuk menentukan variabel DISPLAY saya untuk sesi ketika masuk melalui ssh dan perlu menampilkan X jauh.


Satu liner yang berguna untuk menambahkan IP saya ke file .htaccess. Terima kasih. Saya telah membuat modifikasi untuk FreeBSD: who am i | awk '{print $6}' | sed 's/[()]//g' | sed 's/\./\\./g' Bagian terakhir lolos dari titik-titik.
Olivier - interfaSys

5

Memperbaiki jawaban sebelumnya. Memberikan alamat ip alih-alih nama host. --ips tidak tersedia di OS X.

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

lebih universal, ubah $ 5 menjadi $ 6 untuk 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}'

tidak bekerja pada 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$'bekerja?
Alexx Roche

2

Anda bisa mendapatkannya secara terprogram melalui pustaka 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 akan bekerja (di bagian atas seperti ini) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED


Terima kasih banyak atas jawaban ini, saya akhirnya melakukan 'netstat | grep ssh '.
Ross Aiken

Demi alasan keamanan, ini buruk karena siapa pun dapat terhubung ke port itu, bukan hanya Anda.
CrazyCasta

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

Keluaran:

dua # dalam percobaan saya

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

memberikan alamat IP.

Keluaran:

127.0.0.1:22 # in my experiment

Tetapi hasilnya dicampur dengan pengguna dan barang lainnya. Perlu lebih banyak pekerjaan.


netstat saya hanya memberikan alamat terpotong untuk IPv6 dan "127.0.0.1:22" adalah server daripada klien, (yang ditentukan dalam pertanyaan.)
Alexx Roche

1

utas yang lebih tua dengan banyak jawaban, tetapi tidak ada yang saya cari, jadi saya berkontribusi untuk saya:

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

metode ini kompatibel dengan ssh langsung, pengguna sudoed, dan sesi layar. ia akan menelusuri melalui pohon proses hingga menemukan pid dengan variabel SSH_CLIENT, lalu merekam IP-nya sebagai $ sshClientIP. jika terlalu jauh ke atas pohon, ia akan merekam IP sebagai 'localhost' dan meninggalkan loop.


0

Biasanya ada entri log di / var / log / messages (atau serupa, tergantung pada OS Anda) yang dapat Anda coba gunakan dengan nama pengguna.


0

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

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


0

Cari koneksi SSH untuk akun "myusername";

Ambil string hasil pertama;

Ambil kolom ke-5;

Dibagi dengan ":" dan mengembalikan bagian 1 (nomor port tidak diperlukan, kami hanya menginginkan IP):

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


Cara lain:

siapa aku | 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]}'kata klien ssh saya berasal dari 2a02dan "Cara lain:" kata Andatmux(2445).%3
Alexx Roche


0

Satu jempol untuk jawaban @Nikhil Katre:

Perintah paling sederhana untuk mendapatkan 10 pengguna terakhir yang masuk ke mesin adalah last|head .

Untuk mendapatkan semua pengguna cukup gunakan lastperintah

Yang menggunakan whoataupinky melakukan apa yang pada dasarnya diminta. Tapi Tapi Tapi mereka tidak memberikan info sesi sejarah.

Yang mungkin juga menarik jika Anda ingin mengenal seseorang yang baru saja masuk dan keluar saat Anda memulai pemeriksaan ini.

jika itu adalah sistem multiuser. Saya merekomendasikan menambahkan akun pengguna yang Anda cari:

last | grep $USER | head

EDIT:

Dalam kasus saya, $ SSH_CLIENT dan $ SSH_CONNECTION tidak ada.


0

Perintah paling sederhana untuk mendapatkan 10 pengguna terakhir yang masuk ke mesin adalah last|head. Untuk mendapatkan semua pengguna, cukup gunakan lastperintah


0

Saya mendapatkan output berikut dari who -m --ipspada Debian 10:

root pts / 0 Des 4 06:45 123.123.123.123

Sepertinya kolom baru ditambahkan, jadi {print $5}atau " ambil kolom ke-5 " upaya tidak berfungsi lagi.

Coba ini:

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

Sumber:

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.