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.
đề xuất việc chuyển sang ServerFault, câu hỏi vẫn còn rất lớn mặc dù – BozoJoe