BEZ korzystania z sieciowych wierszy poleceń w systemie Linux, jak poznać listę otwartych portów i proces, który jest ich właścicielem?

11

Chcę wiedzieć, które porty są używane przez które procesy w embedded-linux. Ponieważ jest to prosty embedded-linux, nie ma sieciowych linii poleceń, takich jak netstat, lsof. (istnieją tylko podstawowe wiersze poleceń, takie jak cat, cp, echo itp.).

Częściowym rozwiązaniem wydaje się być użycie wiersza poleceń „cat / proc / net / tcp” i „cat / proc / net / udp”. Jednak nie jestem pewien wydrukowany lista z tych linii poleceń pokazuje wszystkie porty w użytku , a lista nie pokazuje proces, który jest binded do określonego portu .

Wszelkie uwagi będą mile widziane.

Freddy
źródło
Myślę, że to pytanie lepiej pasuje do systemów Unix i Linux

Odpowiedzi:

15

Powinieneś być w stanie znaleźć wszystkie otwarte porty w /proc/net/tcpi /proc/net/udp. Każdy z tych plików ma inodekolumnę, której można użyć do znalezienia procesu będącego właścicielem tego gniazda.

Po uzyskaniu numeru i-węzła możesz uruchomić polecenie ls, ls -l /proc/*/fd/* | grep socket:.$INODEaby znaleźć procesy korzystające z tego gniazda. Jeśli proces został skonfigurowany z różnymi deskryptorami plików dla różnych wątków, może być konieczne rozszerzenie polecenia ls -l /proc/*/task/*/fd/* | grep socket:.$INODE, aby znaleźć je wszystkie.

kasperd
źródło
1
find /proc -lname "socket:\[$INODE\]" 2> /dev/null
Sammitch
0

Aby znaleźć INODES dla dowolnego portu, wykonaj poniższe polecenie

PORT=8080;cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | awk -F ":" '{print "PORT=" $2 ", INODE=" $3 }'

Użyj dowolnego INODE z powyższego wyjścia komendy, aby znaleźć powiązany PID, jak poniżej

find /proc -lname "socket:\[$INODE\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'

tutaj $ INODE jest wartością dowolnego INODE

W poleceniu w jednym wierszu możemy sprawdzić, czy jakikolwiek port jest otwarty i powiązany z dowolnym PID, jak poniżej

PORT=8080;find /proc -lname "socket:\[$(cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | head -n 1 | awk -F ":" '{print $3}')\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'
Anil Agrawal
źródło