2009-06-15 32 views
118

Tôi có một tập lệnh được điều hành bởi một người đăng nhập vào máy chủ với SSH.Tìm địa chỉ IP của ứng dụng khách trong phiên SSH

Có cách nào để tự động tìm ra địa chỉ IP mà người dùng đang kết nối không?

Tất nhiên, tôi có thể hỏi người dùng (nó là một công cụ dành cho người lập trình, vì vậy không có vấn đề gì với điều đó), nhưng nó sẽ mát hơn nếu tôi phát hiện ra.

+2

đề xuất việc chuyển sang ServerFault, câu hỏi vẫn còn rất lớn mặc dù – BozoJoe

Trả lời

191

Kiểm tra nếu có một biến môi trường được gọi là:

$SSH_CLIENT 

HOẶC

$SSH_CONNECTION 

(hoặc bất kỳ biến môi trường khác) mà được thiết lập khi người dùng đăng nhập Sau đó xử lý nó bằng cách sử dụng người dùng. kịch bản đăng nhập.

Giải nén IP:

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

@cwd tôi muốn thay thế các ip trong lệnh này "iptables -A ĐẦU VÀO -s 93.203.118.251 - p tcp --destination-port 443 -j DROP "có khả thi không? – wutzebaer

+2

Đây là REMOTEHOST cho tôi. – dramzy

+3

chỉ hoạt động với người dùng không được sudoed. ví dụ. nếu bạn có một người dùng ssh và sau đó leo lên root, một shell mới sẽ được tạo và các biến này bị mất, trừ khi bạn có thể truy ngược lại cây để tìm ssh pid gốc và lấy các biến từ/proc/$ PID/environ – Andrej

0

Thông thường có một mục nhật ký trong/var/log/messages (hoặc tương tự, tùy thuộc vào hệ điều hành của bạn) mà bạn có thể grep với tên người dùng.

0

Giả sử ông mở một phiên tương tác (nghĩa là, phân bổ một pseudo terminal) và bạn có quyền truy cập vào stdin, bạn có thể call an ioctl on that device để có được số điện thoại (/ dev/pts/4711) và cố gắng tìm một số trong số /var/run/utmp (trong đó cũng sẽ có tên người dùng và địa chỉ IP mà kết nối bắt nguồn từ).

83

Bạn có thể sử dụng lệnh:

server:~# pinky 

mà sẽ cung cấp cho bạn somehting như thế này:

Login  Name     TTY Idle When     Where 

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

Đó là tuyệt vời :-) Nerd hài ​​hước ftw một lần nữa. Theo chương trình 'pinky --help': 'Một bàn phím nhẹ'; in thông tin người dùng. Tệp utmp sẽ là/var/run/utmp.' –

+0

Tại sao nó là 'Vị trí' trong đầu ra của tôi chỉ hiển thị tên máy chứ không phải địa chỉ IP? – isaganiesteron

+0

Có thể bạn đã cấu hình máy chủ định danh trong máy của mình. – vncprado

1

netstat sẽ làm việc (tại một cái gì đó đầu như thế này) tcp 0 0 10. x.xx.xx: ssh someipaddress.or.domainame: 9379 ESTABLISHED

+0

Cảm ơn bạn rất nhiều vì câu trả lời này, tôi đã làm 'netstat | grep ssh '. –

+0

Vì lý do bảo mật, điều này là xấu bởi vì bất kỳ ai cũng có thể được kết nối với cổng đó, không chỉ bạn. – CrazyCasta

27

Hãy thử cách sau để chỉ nhận địa chỉ IP:

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

khá chắc chắn nếu bạn viết whoami và bạn sẽ nhận được tên của người dùng đã đăng nhập. không có điều thứ năm hoặc ip để in xin lỗi. nhưng whoami là một lệnh hữu ích – gerard

+13

'who am i'! =' whoami' trên Linux của tôi ít nhất. Có một điều thứ năm, và nó là tên máy chủ của máy khách. – kbulgrien

+4

Đối với bất cứ ai khác tự hỏi về 'tôi là ai ': Manpage cho' who' nói: 'Nếu ARG1 ARG2 được đưa ra, -m giả sử:' am i 'hoặc' mom likes 'là bình thường.'. Vì vậy, thực sự bất cứ điều gì với hai từ hoạt động, cũng có những thứ như 'người thích icecream'. – jmiserez

0

Linux: tôi là ai | awk '{print $ 5}' | sed 's/[()] // g'

AIX: tôi là ai | awk '{print $ 6}' | sed 's/[()] // g'

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

Output:

hai # trong thử nghiệm của tôi

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

cung cấp cho các địa chỉ IP.

Output:

127.0.0.1:22 # in my experiment 

Nhưng kết quả được trộn lẫn với những người dùng khác và các công cụ. Nó cần nhiều công việc hơn.

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 

Tôi sử dụng này để xác định biến DISPLAY của tôi cho phiên khi đăng nhập thông qua ssh và cần phải hiển thị từ xa X.

+0

Hữu ích một lớp lót để thêm IP của tôi vào tệp .htaccess. Cảm ơn bạn. Tôi đã thực hiện sửa đổi cho FreeBSD: 'tôi là ai | awk '{print $ 6}' | sed 's/[()] // g' | sed 's /\./\./ g'' Phần cuối cùng thoát khỏi các dấu chấm. –

2

Bạn có thể nhận được nó một cách chương trình thông qua một thư viện 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

Tìm kiếm kết nối SSH cho tài khoản "tên người dùng";

Lấy chuỗi kết quả đầu tiên;

Lấy cột thứ 5;

Chia theo ":" và trả lại phần thứ nhất (số cổng không cần, chúng tôi chỉ muốn IP):

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


Một cách khác:

những người am i | awk '{l = length ($ 5) - 2; in substr ($ 5, 2, l)}'

13

Chỉ cần gõ lệnh sau trên máy tính Linux của bạn:

who 
3

Cải thiện trên một câu trả lời trước. Cung cấp địa chỉ IP thay cho tên máy chủ. --ips không có sẵn trên OS X.

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

hơn phổ biến, thay đổi $ 5 đến $ 6 cho 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 
0

một chủ đề cũ với rất nhiều câu trả lời, nhưng không ai khá những gì tôi đang tìm kiếm, vì vậy tôi đang đóng góp của tôi:

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 

phương pháp này tương thích với người dùng ssh, sudoed trực tiếp và phiên màn hình. nó sẽ đi qua cây quá trình cho đến khi nó tìm thấy một pid với biến SSH_CLIENT, sau đó ghi lại IP của nó là $ sshClientIP. nếu nó quá xa cây, nó sẽ ghi lại IP là 'localhost' và để lại vòng lặp.

0

Lệnh đơn giản nhất để có được 10 người dùng cuối cùng đăng nhập vào máy là last|head.

Để có được tất cả những người sử dụng chỉ cần sử dụng lệnh last

Các vấn đề liên quan