![netstat를 사용하여 프로토콜, 포트 및 상태만 표시하는 방법은 무엇입니까?](https://linux55.com/image/94765/netstat%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C%2C%20%ED%8F%AC%ED%8A%B8%20%EB%B0%8F%20%EC%83%81%ED%83%9C%EB%A7%8C%20%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 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/ .*:/ /';
머리말
미래의 독자와 웹 크롤러를 위해 여기서 특별히 다루어야 할 두 가지 사항이 있습니다.
/etc/services
IANA RFC 1340 TCP 및 UDP 포트 할당 번호의 "데이터베이스"(예: 플랫 파일 캐시)입니다. 사람들은 이를 사용하여 정수 포트 번호를 논리적 문자열 이름으로 또는 그 반대로 변환합니다. 를 사용하여 액세스하는 모든 쉘에는 이에 대한 매뉴얼/문서가 있습니다man 5 services
.예, Java와 같은 "고수준" 언어로 작업을 수행한다면
Runtime.getRuntime().exec()
운영 체제를 최대한 활용하지 못하는 것입니다.proc
및 파일 시스템 에서 데이터를 읽는 것이 좋습니다sys
. 쉘과coreutils
.
그건 중요하지 않습니다. 이 질문에 답하려면 먼저 sed
, 및 를 xargs
살펴 보세요 . 는 다른 언어의 와 동등한 스트림 편집기이지만 줄 정리를 수행하고 공백 문자를 공백으로 확장합니다. 청취 전용 출력 플래그도 있습니다. 이는 귀하의 요구 사항을 충족하기 위해 하나의 파이프라인으로 결합됩니다.cut
expand
sed
regex
xargs
map() with lambda
netstat
답변을 분해하세요
주문하다 | 설명하다 |
---|---|
printf |
C/C++ printf() 함수와 동일 [출력 제목] |
netstat -ntl |
/proc/net/tcp DNS 조회 없이 바인딩된 리스너 확인 |
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