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.

flybywire
sumber
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
nolim1t
sumber
@ 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
vnprado
sumber
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}'
AlexP
sumber
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
Bangar
sumber
6
 who | cut -d"(" -f2 |cut -d")" -f1
danilo
sumber
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.

Buih laut
sumber
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
LihatBenKlik
sumber
2
netstat -tapen | grep ssh | awk '{ print $4}'
Sébastien Moreau
sumber
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;
}
vineetv2821993
sumber
1

netstat akan bekerja (di bagian atas seperti ini) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED

aric
sumber
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.

Gerard
sumber
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.

Andrej
sumber
0

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

Daniel Schneller
sumber
0

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

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

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

Nex
sumber
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

Dengan asumsi dia membuka sesi interaktif (yaitu, mengalokasikan terminal semu ) dan Anda memiliki akses ke stdin, Anda dapat memanggil ioctl pada perangkat itu untuk mendapatkan nomor perangkat (/ dev / pts / 4711) dan mencoba untuk menemukannya di / var / run / utmp (di mana juga akan ada nama pengguna dan alamat IP asal koneksi).

mihi
sumber
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.

Kangqiao Zhao
sumber
0

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

Nikhil Katre
sumber
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:

aexl
sumber