"">/dev/tcp/ip/port"에서 "연결 거부됨" 줄을 제거하는 방법

"">/dev/tcp/ip/port"에서 "연결 거부됨" 줄을 제거하는 방법

열린 포트

user@linux:~$ >/dev/tcp/127.0.0.1/8080 && echo open || echo closed
open
user@linux:~$ 

항구를 닫다

user@linux:~$ >/dev/tcp/127.0.0.1/8088 && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
closed
user@linux:~$ 

stderr를 /dev/null로 리디렉션하면 작동하지 않습니다.

user@linux:~$ >/dev/tcp/127.0.0.1/8088 2>/dev/nul
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
user@linux:~$ 

원하는 출력

user@linux:~$ >/dev/tcp/127.0.0.1/8088 && echo open || echo closed
closed
user@linux:~$ 

답변1

리디렉션 순서를 반대로 하고 bashstderr이 stdin보다 먼저 와야 함을 알려 주세요.

$ >/dev/tcp/127.0.0.1/8088 2>/dev/nul
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
$ 2>/dev/null >/dev/tcp/127.0.0.1/8088 && echo open || echo closed
closed
$ 

첫 번째 버전이 실패하는 이유는 리디렉션이 발생한 순서대로 처리되기 때문에 >/dev/tcp/127.0.0.1/8088 2>/dev/null해당 포트로의 리디렉션이 발생할 때 stderr 스트림이 아직 리디렉션되지 않았기 때문입니다. 유틸리티를 사용하면 진단 출력에서 ​​stderr를 리디렉션하는 해당 시스템 호출 dup2()(또는 명령이 실패할 경우 리디렉션 부족)을 명확하게 확인할 수 있습니다.strace

$ strace -e dup2,connect  -f bash -c '>/dev/tcp/127.0.0.1/8088 2>/dev/null'
connect(3, {sa_family=AF_INET, sin_port=htons(8088), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
+++ exited with 1 +++
$ strace -e dup2,connect  -f bash -c '2>/dev/null >/dev/tcp/127.0.0.1/8088 '
dup2(3, 2)                              = 2
connect(3, {sa_family=AF_INET, sin_port=htons(8088), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
dup2(10, 2)                             = 2
+++ exited with 1 +++
$ 

관련 정보