Клиент SSH и сервер обмениваются сообщениями для настройки переадресации, но сетевая таблица ядра заботится/знает только о своем локальном стеке IP, поэтому видит только sshd
.
Но OpenSSH также использует некоторые детали среды (, которые также передаются через обмен сообщениями ).
sshcpid=$(pgrep -P 1074) # fetch child PID
xargs -0 -L1 -a /proc/$sshcpid/environ # show environment strings
Обе переменные SSH_CLIENT
и SSH_CONNECTION
должны содержать то, что вам нужно.
Здесь xargs
— это удобный способ обработки строк с разделителями NUL вenviron
.
Это предполагает:
/proc
сenviron
OpenSSH с такой цепочкой процессов, как:
демон sshd → разветвленное соединение sshd → privsep sshd → пользовательская оболочка
напр. (изpstree -lp
):
init(1)-+
.
|-sshd(1015) +-sshd(1072)---sshd(1074)---bash(1075)
Процесс privsepsshd
— это тот, который вы видите в netstat
, окружение, которое вы читаете, происходит от его непосредственного потомка, оболочки (bash в этом примере ).
Хотя, безусловно, есть возможность сделать это с помощью miller
, на ум приходит решение, основанное наawk
-:
awk 'NR==FNR{if ($1 in map) map[$1]=map[$1] OFS $2; else map[$1]=$2; next}
{print $1,map[$1]}' file2.txt file1.txt
Сначала будет обработан второй файл и собраны все «значения», связанные с одним и тем же «ключом». Затем он обработает первый файл, чтобы вывести список «значений» для каждой клавиши.
И подход Perl:
perl -e 'while(<>){
chomp;
@fields = split(/\s+/);
push @{$values{$fields[0]}},$fields[1];
}
foreach $value (sort keys(%values)){
print "$value @{$values{$value}}\n"
}' file2
Или то же самое, если вы предпочитаете гольф:
$ perl -lane 'push@{$k{$F[0]}},$F[1]}{print"$_ @{$k{$_}}"for sort keys %k' file2
1 aa ae
2 ab ad af
3 ac
Затем, чтобы напечатать только значения из file1
, вы можете передать их черезgrep
:
$ perl -lane 'push@{$k{$F[0]}},$F[1]}{print"$_ @{$k{$_}}"for keys %k' file2 |
grep -wf file1
1 aa ae
2 ab ad af
3 ac