Собрать записи «атрибута ключа -» в один файл и добавить их в список ключей в другом файле

Клиент 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.

Это предполагает:

  • linux, для /procсenviron
  • OpenSSH с такой цепочкой процессов, как:

    демон sshd → разветвленное соединение sshd → privsep sshd → пользовательская оболочка

напр. (изpstree -lp):

 init(1)-+
        .
         |-sshd(1015) +-sshd(1072)---sshd(1074)---bash(1075)

Процесс privsepsshd— это тот, который вы видите в netstat, окружение, которое вы читаете, происходит от его непосредственного потомка, оболочки (bash в этом примере ).

0
07.10.2020, 11:27
2 ответа

Хотя, безусловно, есть возможность сделать это с помощью 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

Сначала будет обработан второй файл и собраны все «значения», связанные с одним и тем же «ключом». Затем он обработает первый файл, чтобы вывести список «значений» для каждой клавиши.

2
18.03.2021, 22:59

И подход 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
1
18.03.2021, 22:59

Теги

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