일부 netstat 명령과 함께 grep을 사용하려면 sudo priv가 필요한 이유는 무엇입니까?

일부 netstat 명령과 함께 grep을 사용하려면 sudo priv가 필요한 이유는 무엇입니까?

체계:

  • 우분투 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출력을 전체 화면으로 제어하고 작성된 메시지를 처리하지 않는 경우).표준 에러).

관련 정보