Получить исходный IP-адрес сеанса ssh, не будучи суперпользователем

Я пытаюсь узнать исходный 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?

( Ответ # 1 Вопрос: Как получается, что конвейерная программа grep возвращает только ошибку?)

Вопрос № 2: Существуют ли обходные пути для получения информации о глобальной сети с помощью netstat? или ...

Вопрос № 3: Есть ли лучшие варианты для моей цели?

6
задан 14 April 2015 в 14:15

4 ответа

Ответьте на 1 и 2:

Предупреждение от netstat, не от grep и о PID/Program name столбец netstat вывод:

$ netstat -tapen
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name

Используя sudo:

$ sudo netstat -tapen
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name

Предупреждение сам объяснительное, необходимо быть root для просмотра идентификаторов процесса и названий программы, принадлежавших другим (всем) пользователям иначе, Вы только получите PID/имена программ, принадлежавших Вам, хотя Вы получите открытые списки сокетов для тех процессов.

Различию в основном подводит итог следующее, от man netstat:

   PID/Program name
       Slash-separated pair of the process id (PID) and process name of
the process that owns the socket.  --program causes this column  to
be  included. You will also need superuser privileges to see this  
information on sockets you don't own. This identification information is  
not yet available for IPX sockets.

В Вас случай, программа sshd принадлежит root, таким образом без использования sudo вся информация о сокете появится в выводе, не названии программы и PID. В результате при использовании grep на результате netstat -taepn Вы получаете предупреждение.

С другой стороны, если Вы используете sudo, PID/название программы появится в netstat -taepn вывод и Вы можете использовать grep найти вывод.

Следующее сделает Вас более ясными (проверьте последний столбец (PID/Название программы)):

$ netstat -tapen
                                                        PID/Program name
tcp  0  0 0.0.0.0:22  0.0.0.0:* LISTEN  0   11088       -               

$sudo netstat -taepn
tcp  0  0 0.0.0.0:22  0.0.0.0:* LISTEN  0   11088       1002/sshd       

При выполнении этого от клиентской машины затем, можно просто проигнорировать ее, как процесс в этом случае будет ssh (нет sshd) и будет принадлежать Вам.

Ответьте на 3:

Существует столько путей. Я добавлю некоторых:

$ sudo netstat -taepn | grep "ssh" | tr -s ' ' | cut -d' ' -f4 | head -1
192.168.5.3:22

$ sudo netstat -taepn | grep -Po "\b(\d|\.)+:22(?= .*ssh)"
192.168.5.3:22

$ sudo netstat -taepn | sed -nr '/ssh/s/.* ([^:]+:22) .*/\1/p'
192.168.5.3:22

Править: Без sudo:

$ netstat -taepn 2>/dev/null | grep ":22 " | tr -s ' ' | cut -d' ' -f4 | head -1
192.168.5.3:22

$ netstat -taepn 2>/dev/null | grep -Po "\b(\d|\.)+:22\b"
192.168.5.3:22

$ netstat -taepn 2>/dev/null | sed -nr '/:22 /s/.* ([^:]+:22) .*/\1/p'
192.168.5.3:22

РЕДАКТИРОВАНИЕ 2:

Если Вы хотите соединить удаленный IP-адрес для портирования 22 (ssh) из сервера без использования sudo, Ваше лучшее лучшее должно было бы считать статистику сокета через ss управляйте и получите желаемый вывод от этого.

$ ss -ant | grep -Po "(\d|\.)+:22\s+\K[^:]+"
192.168.6.4

$ ss -ant | sed -nr 's/.*([0-9]|\.)+:22 +([^:]+).*/\2/p'
192.168.6.4

$ ss -ant | grep -e "ESTAB" | grep ":22" | tr -s ' ' | cut -d' ' -f5 | cut -d':' -f1
192.168.6.4

Мы выполнили вышеупомянутые команды в сервере и 192.168.6.4 IP-адрес удаленного компьютера, подключенного к серверу через ssh на порте 22.

7
ответ дан 14 April 2015 в 14:15

Строка является bellogs к выводу ошибок, т.е. sterr. Вы могли избавиться от него с

netstat -tapen 2> /dev/null | grep ssh

Для ссылки проверка, это

enter image description here

, Как правильно отмечено heemayl, без sudo, netstat не сообщит, что соединение устанавливается ssh сервером, только если это устанавливается ssh клиентом.

, Конечно, можно все еще определить его номером порта или использованием who -a утилита, которая покажет логины и адрес, но это не гарантия, кто-то не зарегистрирован на пути приложение удаленного рабочего стола или telnet.

0
ответ дан 14 April 2015 в 14:15

Можно использовать 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 более легко, если Вы разделяете его на массив удара:

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 не документируется в английские страницы справочника.

15
ответ дан 14 April 2015 в 14:15

Перед продолжением читать для чтения ответа 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. Я не знаю, почему это работает при Вашем пользователе.

0
ответ дан 15 April 2015 в 00:15

Другие вопросы по тегам:

Похожие вопросы: