Я пытаюсь выяснить текущий IP-адрес текущего ssh-сессии. Я нашел следующее полезным, но для этого требуется sudo:
$ sudo netstat -tapen | grep ssh | awk '{ print $5}' | sed '/0.0.0.0\|::/d'
192.168.1.1:60119
99.xxx.xxx.xxx:1213
Есть ли способ получить информацию 99.xxx.xxx.xxx без вызова sudo?
[d2 ] (Answered! Question # 1: Как это, что piping для grep возвращает только ошибку?)Вопрос № 2: Есть ли способы обхода WAN-информации с netstat? или ...
Вопрос № 3: Есть ли лучшие варианты для моей цели?
Вы можете использовать переменные SSH_CONNECTION и SSH_CLIENT:
$ echo $SSH_CONNECTION
10.0.0.1 42276 10.0.0.2 22
$ echo $SSH_CLIENT
10.0.0.1 42276 22
$ SSH_IP=${SSH_CONNECTION%% *}
$ echo $SSH_IP
10.0.0.1
Из man 1 ssh:
SSH_CONNECTION Identifies the client and server ends of the
connection. The variable contains four space-
separated values: client IP address, client port
number, server IP address, and server port number.
Вы можете получить доступ к каждой записи в SSH_CONNECTION более легко, если вы разделите его на массив bash:
ssh_details=($SSH_CONNECTION)
Затем вы можете получить каждую запись, используя свой индекс:
$ echo $SSH_CONNECTION
127.0.0.1 55719 127.0.0.1 22
$ ssh_details=($SSH_CONNECTION)
$ echo ${ssh_details[0]}
127.0.0.1
$ echo ${ssh_details[1]}
55719
$ printf "You are logging in from host IP %s from port # %d\n" ${ssh_details[0]} ${ssh_details[1]}
You are logging in from host IP 127.0.0.1 from port # 55719
По какой-то причине SSH_CLIENT не задокументировано в английских manpages.
Линия является сигналом для выхода ошибки, т. е. sterr. Вы можете избавиться от него с помощью
netstat -tapen 2> /dev/null | grep ssh
Для справки проверьте это
Как правильно отмечено heemayl, без [ f3], netstat не сообщит, что соединение установлено сервером ssh, только если оно установлено ssh-клиентом.
Конечно, вы все равно можете определить его по номеру порта или с помощью утилиты who -a, которая будет отображать логины и адрес, но это не гарантия, что кто-то не зашел в систему через telnet или приложение удаленного рабочего стола.
Прежде чем читать, чтобы прочитать ответ SSH_CLIENT (это было так просто, что вы знаете), вы также можете сделать:
pid=$(ps -xh -o pid,cmd | grep [s]shd | awk '{print $1}' | head -1)
cat /proc/$pid/net/tcp | while read a b c d e; do echo $b $c $d; done |
tail -n +2 | grep " 01" | while read a b c; do echo $b; done |
cut -d: -f1 | sed "s/../& /g" | while read d c b a; do
printf "%d.%d.%d.%d\n" 0x$a 0x$b 0x$c 0x$d; done
На самом деле процесс содержит соединения для всех клиентов, а не только ваши собственные. Это основной процесс SSHD. Я не знаю, почему он работает под вашим пользователем.