내가 발견했다이 방법특정 포트에서 호스트에 액세스할 수 있는지 확인하는 중이지만 명령의 상태 코드에만 관심이 있으므로 다음과 같이 시도하고 있습니다.
[CptBartender@somewhere ~]$ <dev/tcp/host/port ; echo $?
0
열린 포트에서 시도하면 제대로 작동하지만 닫힌 포트를 확인하면 다음과 같은 결과가 나타납니다.
[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port ; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1
이제 다음 단계는 첫 번째 명령의 출력을 삭제하는 것이었으므로 다음을 시도했습니다.
[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port >/dev/null/ 2>&1; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1
동일한 출력. 내 질문은 첫 번째 명령이 어떤 출력이든 인쇄하는 이유는 무엇이며 그렇게 하지 않도록 하려면 어떻게 해야 합니까?
답변1
그것은 아니다명령그것이 인쇄 출력입니다. 당신은 가지고 있지 않습니다어느명령 – 이것은 < /dev/tcp/…
단지 규칙적입니다입력 리디렉션쉘 자체에서 처리됩니다.
(그뿐만 아니라 리디렉션은 왼쪽에서 오른쪽으로 처리되므로 리디렉션 <
이 처리됩니다.~ 전에하나 2>&1
이므로 리디렉션할 수 없습니다.그래도.)
서브셸에서 "명령"을 실행하여 이 문제를 해결할 수 있습니다. 예를 들어:
( </dev/tcp/$host/$port ) 2>/dev/null
실제로 이 경우에는 서브쉘이 필요하지 않은 것 같습니다. 명령 그룹은 동일한 프로세스 내에 있더라도 작동합니다. 여전히 "외부" 리디렉션이 먼저 처리되도록 강제합니다.
{ </dev/tcp/$host/$port; } 2>/dev/null
참고 사항: /dev/tcp
bash 자체에서 처리되는 매직 경로입니다. 실제로 Linux의 /dev에는 존재하지 않지만 bash 리디렉션과 함께 사용할 수 있습니다. 그러나 이 트릭은 에서는 작동하지 않으며 #!/bin/sh
일부 이전 시스템(이 기능을 비활성화하는 데 사용됨) 또는 일부 비 Linux 시스템에서는 bash에서 작동하지 않을 가능성이 여전히 있습니다.