Как узнать, какой процесс сохраняет туннельный интерфейс (бочка)?

Решение для Perl:

Проблема 1.

File1.dat читается в хеш, первый столбец является ключом, второй столбец является значением. Затем File2.dat обрабатывается, и значение от хеша вставляется в массив, представляющий значения на одной строке согласно ключу, взятому сначала (в Perl, нулевом) столбец.

#!/usr/bin/perl
use warnings;
use strict;

my %tab;

open my $F1, '<', 'File1.dat' or die $!;
while (<$F1>) {
    chomp;
    my ($key, $value) = split /\|/; # Here, the delimiter is mentioned.
    $tab{$key} = $value;
}

open my $F2, '<', 'File2.dat' or die $!;
while (<$F2>) {
    chomp;
    my @cols = split /\|/;
    splice @cols, 1, 0, $tab{$cols[0]};
    print join('|', @cols), "\n";
}

Можно получить подобный вывод со стандартом utils:

join -a2 -t'|' <(sort File1.dat) <(sort File2.dat) | sort -n

Проблема 2.

Помните, какую комбинацию полей Вы уже видели в хеше. Если комбинация является новой, распечатайте строку, иначе ничего не сделайте.

#!/usr/bin/perl
use warnings;
use strict;
use feature 'say';

my %seen;
while (<>) {
    chomp;
    my @fields = split /\|/, $_, 2;          # Only split into 2 fields.
    say unless exists $seen{$fields[1]};     # Do not print if already seen.
    undef $seen{$fields[1]};                 # Mark the key as seen.
}
6
27.04.2015, 22:29
3 ответа

Если у вас есть файловая система / procsystem, вы можете использовать эту последовательность команд:

find /proc/ -name tun0 | cut -d\/ -f3 | uniq | xargs -IPID lsof -p PID
0
27.01.2020, 20:29

Похоже, ядро ​​не раскрывает эту информацию. Поэтому, если не считать отладки ядра, я не думаю, что вы можете это знать. Лучшее, что вы можете сделать, это перечислить все процессы, у которых есть tun или tap устройства, открываются следующим образом:

lsof /dev/net/tun

Это сузит круг, но в случае нескольких активных tun взаимодействует с системой, он не сообщает вам, какой процесс каким туннелем управляет.

Когда процесс хочет создать интерфейс tun , он открывает / dev / net / tun независимо от того, какой интерфейс tun он намеревается использовать. Затем он либо позволяет ядру динамически назначать новое имя интерфейса tun (например, tun0 , tun1 , tun2 и т. Д.).) или устанавливает выбранное имя. Это делается с помощью вызова ioctl с кодом TUNSETIFF . Так что, пока вы не отследите этот вызов ioctl , на самом деле нет способа узнать, какое имя было присвоено.

4
27.01.2020, 20:29

Ядро Linux теперь предоставляет эту информацию в /proc/$PID/fdinfo/$FD. Например:

# grep ^iff: /proc/*/fdinfo/*
/proc/31219/fdinfo/5:iff:       tun0
/proc/31235/fdinfo/5:iff:       tun1
/proc/31252/fdinfo/5:iff:       tun2
/proc/31267/fdinfo/5:iff:       tun3

Протестировано с Debian 5.8.10.

2
13.01.2021, 08:52

Теги

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