Я подключаюсь через SSH от хоста A к хосту B.
Есть ли способ найти источник соединения и повторно подключиться от B к A (например, сделать scp от B к A)?
Если Вы просто хотите найти хост, Вы соединились от, используйте w
:
$ who -m --ips
terdon pts/4 2015-06-08 20:02 123.456.78.9
Для получения IP только:
$ who -m --ips | awk '{print $NF}'
123.456.78.9
Так, к scp от того хоста, Вы могли сделать:
scp user@$(who -m --ips | awk '{print $NF}'):/remote/path /target/path
Эта команда показывает установленные соединения SSH и целевого пользователя:
LANG=C netstat | grep ESTABLISHED | awk '/:22 |:ssh/ {sub(/:.*/,"",$5 ); system("who | grep \""$5"\"") }'
пользователь, который установил соединение, не может быть определен.
И только хост:
LANG=C netstat | grep ESTABLISHED | awk '/:22 |:ssh/ {sub(/:.*/,"",$5 ); system("who | grep \""$5"\"") }' | awk '{gsub(/\(|\)/, "", $5); print $5}'
Для получения IP-адреса хоста, Вы соединены от, можно использовать grep
на выводе ss
:
ss -nt | grep -Po '^ESTAB.*?:22\s+\K[^:]+(?=:\d+)'
Например:
$ ss -nt | grep -Po '^ESTAB.*?:22\s+\K[^:]+(?=:\d+)'
192.168.11.225
ss
обозначает статистику сокета, ss -nt
покажет сокеты TCP с числовыми адресами как конечные точки
grep -Po
получит только подобранную часть от строки с помощью PCRE (Совместимые с Perl регулярные выражения)
^ESTAB.*?:22\s+
будет соответствовать ESTAB
в запуске, сопровождаемом портом 22
с чем-либо промежуточным, \K
отбросит соответствие
[^:]
будет соответствовать нашему желаемому IP-адресу
Положительная нулевая ширина предусматривает шаблон (?=:\d+)
удостоверьтесь, что IP-адрес сопровождается :<port>