체계:
- 우분투 20.04.06
- 네트워크 도구 2.10-알파
- grep (GNU grep) 3.4
sudo 없이 netstat를 실행하면 포트 정보는 표시되지만 프로세스 정보는 표시되지 않습니다. 이는 프로세스 정보에 높은 권한이 필요하기 때문에 예상되는 현상입니다.
$ netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:43445 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:41933 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:42649 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:46059 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:45983 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5001 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5433 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:34903 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:37257 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:37081 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:38445 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:38335 0.0.0.0:* LISTEN -
tcp6 0 0 ::1:3350 :::* LISTEN -
tcp6 0 0 ::1:631 :::* LISTEN -
tcp6 0 0 :::2377 :::* LISTEN -
tcp6 0 0 :::3389 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::25 :::* LISTEN -
tcp6 0 0 :::111 :::* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 :::7946 :::* LISTEN -
tcp6 0 0 :::5001 :::* LISTEN -
tcp6 0 0 :::5433 :::* LISTEN -
tcp6 0 0 :::5432 :::* LISTEN -
udp 0 0 127.0.0.53:53 0.0.0.0:* -
udp 0 0 0.0.0.0:111 0.0.0.0:* -
udp 0 0 0.0.0.0:631 0.0.0.0:* -
udp 0 0 0.0.0.0:4789 0.0.0.0:* -
udp 0 0 0.0.0.0:5353 0.0.0.0:* -
udp 0 0 0.0.0.0:43294 0.0.0.0:* -
udp6 0 0 :::52206 :::* -
udp6 0 0 :::111 :::* -
udp6 0 0 :::5353 :::* -
udp6 0 0 :::7946 :::* -
그러나 해당 출력을 grep으로 보내려고 하면 sudo priv가 필요하다는 오류가 발생합니다. 왜? 표준 출력에는 프로세스 정보가 표시되지 않습니다. grep이 이를 변경하는 이유는 무엇입니까?
$ netstat -tulpn | grep 8080
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
문제 해결:
-p
포함하지 않으면netstat -tuln | grep 8080
이런 일이 발생하지 않습니다 (예:netstat -tulpn | grep 8
더 작은 문자열(예:- 를 사용해도
ss
동일한 문제가 표시되지 않습니다(예:ss -tulpn | grep 8080
)
여기서 무슨 일이 일어나고 있는 걸까요?
참고: 예, netstat는 더 이상 사용되지 않으며 이를 사용해야 한다는 것을 알고 있습니다 ss
. 이 동작이 발생하는 이유가 궁금합니다.
답변1
이 메시지를 항상 받을 가능성이 높지만,언제변경된 메시지를 받았습니다.
grep을 우회하여 메시지가 stderr로 전송됩니다. 그래서 당신이 그것을 볼 때 몇 가지 경쟁 조건이 있습니다.
netstat는 데이터를 인쇄하기 전에 구문 분석 후 즉시 옵션을 인쇄할 수 있습니다. grep이 즉시 데이터 인쇄를 시작하면 메시지가 다른 출력과 혼합되어 놓칠 수도 있고 결국 인쇄될 수도 있습니다. grep에 시간이 걸리면 이 메시지가 출력 시작 부분에 나타날 수 있습니다.
버퍼링과 파이프로 인한 임의 지연이 없으면 메시지는 항상 시작 부분에 있어야 합니다.
메시지를 무시하고 싶다면 시도해 볼 수 있습니다
netstat -tulpn 2> /dev/null | grep 8080
grep으로 메시지를 항상 필터링하려면 시도해 볼 수 있습니다(bash와 같은 최신 셸의 경우).
netstat -tulpn /dev/null |& grep 8080
또는 이에 상응하는 것(모든 쉘에 대해)
netstat -tulpn 2&>1 | grep 8080
원시 명령을 호출기로 파이프하면 stderr 출력도 호출기를 우회하여 잠깐 보일 수 있지만 호출기는 인쇄 및/또는 삭제가 거의 보장됩니다.
답변2
지적한 대로 netstat
일부 정보를 표시하려면 루트로 실행해야 합니다. grep
파이프에서 데이터를 읽는 데 특별한 권한이 필요하지 않습니다. 그래서,
sudo netstat -tulpn | grep 8080
루트 권한이 없으면 -p
이 플래그는 귀하에게 속하지 않은 프로세스에 대한 세부 정보를 표시하라는 지시를 받을 때 항상 경고를 트리거합니다. 어쩌면 메시지를 보지 못했을 수도 있습니다(특히 결과를 grep
호출기로 보내는 경우 , 예를 들어 less
출력을 전체 화면으로 제어하고 작성된 메시지를 처리하지 않는 경우).표준 에러).