netstat를 사용하여 프로토콜, 포트 및 상태만 표시하는 방법은 무엇입니까?

netstat를 사용하여 프로토콜, 포트 및 상태만 표시하는 방법은 무엇입니까?

나는 netstat -lt | grep LISTEN모든 청취 TCP 포트를 나열하는 데 사용합니다. Java 애플리케이션을 통해 이 데이터를 사용해야 하므로 Java에서 처리 오버헤드를 줄이기 위해 셸에서 출력 형식을 지정하고 싶습니다. 내가 원하는 것은:

Protocol port status
tcp      4567 LISTEN

출력 유형. netstat를 사용하여 이를 달성할 수 있는 방법이 있습니까? 아니면 유닉스에서 이를 달성하기 위한 다른 네트워크 응용 프로그램을 제공합니까?

또한 다음을 통해 서비스 파일을 읽어 보았습니다.

less /etc/services | grep tcp | cut -d '#' -f 1

그러나 이렇게 하면 열려 있는지 여부에 관계없이 모든 TCP 포트가 나열됩니다. 어떤 제안이라도 좋을 것입니다!

답변1

또는 쉘 프로그램 실행의 보안 문제를 다루는 대신 /proc/net/tcp 파일을 읽으십시오.

답변2

너무 오래;

printf "Protocol port status";
netstat -nlt \
  |sed -e '/LISTEN/p;d' -e '1,2d' \
  |xargs -n6 \
  |cut -d\  -f1,4,6 \
  |sed 's/ .*:/ /';

머리말

미래의 독자와 웹 크롤러를 위해 여기서 특별히 다루어야 할 두 가지 사항이 있습니다.

  1. /etc/servicesIANA RFC 1340 TCP 및 UDP 포트 할당 번호의 "데이터베이스"(예: 플랫 파일 캐시)입니다. 사람들은 이를 사용하여 정수 포트 번호를 논리적 문자열 이름으로 또는 그 반대로 변환합니다. 를 사용하여 액세스하는 모든 쉘에는 이에 대한 매뉴얼/문서가 있습니다 man 5 services.

  2. 예, Java와 같은 "고수준" 언어로 작업을 수행한다면 Runtime.getRuntime().exec()운영 체제를 최대한 활용하지 못하는 것입니다. proc및 파일 시스템 에서 데이터를 읽는 것이 좋습니다 sys. 쉘과 coreutils.

그건 중요하지 않습니다. 이 질문에 답하려면 먼저 sed, 및 를 xargs살펴 보세요 . 는 다른 언어의 와 동등한 스트림 편집기이지만 줄 정리를 수행하고 공백 문자를 공백으로 확장합니다. 청취 전용 출력 플래그도 있습니다. 이는 귀하의 요구 사항을 충족하기 위해 하나의 파이프라인으로 결합됩니다.cutexpandsedregexxargsmap() with lambdanetstat

답변을 분해하세요

주문하다 설명하다
printf C/C++ printf() 함수와 동일 [출력 제목]
netstat -ntl /proc/net/tcpDNS 조회 없이 바인딩된 리스너 확인
sed -e '/LISTEN/p;d' -e '1,2d' sed를 순서대로 두 번 실행합니다. 모든 LISTEN 레코드를 찾고, 다른 모든 레코드를 삭제하고, 라인 1과 2를 삭제합니다(netstat의 헤더, 출력 수정 방지).
xargs -n6 출력을 공백으로 구분된 6개 열의 레코드 형식으로 지정
cut -d\ -f1,4,6 공백 구분 기호를 사용하고 1, 4, 6열을 선택합니다.
sed 's/ .*:/ /' 두 번째 열을 후처리하여 IP 주소 제거

답변3

여기에는 열 헤더가 포함되지 않지만 탭으로 구분된 형식으로 필요한 데이터가 제공됩니다.

netstat -lnt | tail -n+3 | awk '{print $1 "\t" $4 "\t" $6}'

내 컴퓨터에서 실행하면 다음과 같은 결과가 나타납니다.

tcp     127.0.0.1:3306  LISTEN
tcp     0.0.0.0:22      LISTEN
tcp6    :::22   LISTEN

관련 정보