Tìm địa chỉ IP của máy khách trong phiên SSH


166

Tôi có một đoạn script được điều hành bởi một người đăng nhập vào máy chủ bằng 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 lập trình viên, vì vậy không có vấn đề gì với điều đó), nhưng sẽ tuyệt hơn nếu tôi phát hiện ra.


5
đề nghị chuyển sang serverfault, vẫn còn một câu hỏi hay
BozoJoe

Câu trả lời:


266

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

$SSH_CLIENT 

HOẶC LÀ

$SSH_CONNECTION

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

Trích xuất IP:

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

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

2
Đây là TUYỆT VỜI cho tôi.
kịch 7/7/2016

5
chỉ hoạt động với người dùng không sudoed. ví dụ: nếu bạn có một người dùng ssh và sau đó leo thang đến root, một shell mới được tạo và các biến này bị mất, trừ khi bạn có thể theo dõi lại qua cây để tìm ssh pid ban đầu và lấy các biến từ / Proc / $ PID / môi trường
Andrej

5
cảm ơn stackoverflow.com/questions/428109/extract-subopes-in-bash câu trả lời này có thể được cải thiện thành đơn giản${SSH_CLIENT%% *}
Jeff

@Andrej nhìn vàosudo -E
Jeff

105

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

server:~# pinky

điều đó sẽ cung cấp cho bạn một số điều như thế này:

Login      Name                 TTY    Idle   When                 Where 

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

13
Thật tuyệt vời :-) Nerd hài ​​hước một lần nữa. Theo pinky --help:A lightweight 'finger' program; print user information. The utmp file will be /var/run/utmp.
Chris Woods

Tại sao nó là 'Trường hợp' trong đầu ra của tôi chỉ hiển thị tên máy chứ không hiển thị địa chỉ IP?
isaganiesteron

Có lẽ bạn đã có máy chủ tên được cấu hình trong máy của bạn.
vncprado

Pinky sẽ hiển thị tất cả người dùng đã đăng nhập, không chỉ riêng bạn
Andrej

33

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

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

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

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

5
Đối với bất cứ ai khác thắc mắc về who am i: Trang web cho whobiết : If ARG1 ARG2 given, -m presumed: 'am i' or 'mom likes' are usual.. Vì vậy, thực sự bất cứ điều gì với hai từ hoạt động, cũng những điều như who likes icecream.
jmiserez

3
Dựa trên câu trả lời này, tôi đã giảm nó xuống who -m --ips|awk '{print $5}'để tôi chỉ có IP và không có câu trả lời ngược. Cảm ơn sự giúp đỡ trên who am i!
Yvan

1
Thất bại với tmux: who am i|awk '{ print $5}' (tmux(2445).%3)
Alexx Roche

19

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

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

Tôi sử dụng điều này để xác định biến HIỂN THỊ của mình cho phiên khi đăng nhập qua ssh và cần hiển thị từ xa X.


Hữu ích một lớp lót để thêm IP của tôi vào tập tin .htaccess. Cảm ơn bạn. Tôi đã thực hiện một sửa đổi cho FreeBSD: who am i | 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.
Olivier - interfaSys

5

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

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

phổ quát hơn, thay đổi $ 5 thành $ 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

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

không hoạt động trên CentOS 6.9 (công cụ mạng 1.60 netstat 1.42)(No info could be read for "-p": geteuid()=507 but you should be root.)
Jeff

@Jeff không sudo ss -tapen | grep ssh | awk '{ print $4}'|grep -v ':22$'hoạt động?
Alexx Roche

2

Bạn có thể tải nó theo cách lập trình thông qua thư viện SSH ( https://code.google.com.vn/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 sẽ hoạt động (ở trên cùng một cái gì đó như thế này) tcp 0 0 10.x.xx.xx: ssh someipaddress.or.domainame: 9379 THÀNH LẬP


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

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

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

Đầu ra:

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

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

cho địa chỉ IP.

Đầu ra:

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 và công cụ khác. Nó cần nhiều công việc hơn.


netstat của tôi chỉ cung cấp một địa chỉ rút gọn cho IPv6 và "127.0.0.1:22" là máy chủ chứ không phải máy khách, (được chỉ định trong câu hỏi.)
Alexx Roche

1

một chủ đề cũ hơn với rất nhiều câu trả lời, nhưng không có gì hoàn toàn là 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 ssh trực tiếp, người dùng sudo và phiên màn hình. nó sẽ đi qua cây quy trình cho đến khi 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 IP dưới dạng 'localhost' và rời khỏi vòng lặp.


0

Thông thường có một mục nhật ký trong / var / log / message (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

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

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


0

Tìm kiếm các kết nối SSH cho tài khoản "myusername";

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

Lấy cột thứ 5;

Chia cho ":" và trả lại phần 1 (số cổng không cần thiết, chúng tôi chỉ muốn IP):

netstat -tapen | grep "sshd: tên người dùng" | đầu -n1 | awk '{chia ($ 5, a, ":"); in một [1]} '


Cách khác:

tôi là ai awk '{l = chiều dài ($ 5) - 2; chất nền in ($ 5, 2, l)} '


sudo ss -tapen | grep "sshd: $(whoami)"|head -n1|awk '{split($5, a, ":"); print a[1]}'cho biết khách hàng ssh của tôi đến từ 2a02và "Cách khác:" của bạn nóitmux(2445).%3
Alexx Roche


0

Hãy giơ ngón tay cái lên cho câu trả lời của @Nikhil Katre:

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ả người dùng chỉ cần sử dụng lastlệnh

Một trong những sử dụng whohoặc pinkyđã làm những gì về cơ bản được yêu cầu. Nhưng Nhưng họ không cung cấp thông tin phiên lịch sử.

Điều này cũng có thể thú vị nếu bạn muốn biết ai đó vừa đăng nhập và đăng xuất khi bạn bắt đầu kiểm tra này.

nếu nó là một hệ thống nhiều người dùng Tôi khuyên bạn nên thêm tài khoản người dùng mà bạn đang tìm kiếm:

last | grep $USER | head

BIÊN TẬP:

Trong trường hợp của tôi, cả $ SSH_CLIENT và $ SSH_CONNECTION đều không tồn tại.


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ả người dùng, chỉ cần sử dụng lastlệnh


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.