!["">/dev/tcp/ip/port"에서 "연결 거부됨" 줄을 제거하는 방법](https://linux55.com/image/173786/%22%22%26gt%3B%2Fdev%2Ftcp%2Fip%2Fport%22%EC%97%90%EC%84%9C%20%22%EC%97%B0%EA%B2%B0%20%EA%B1%B0%EB%B6%80%EB%90%A8%22%20%EC%A4%84%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
열린 포트
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
리디렉션 순서를 반대로 하고 bash
stderr이 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 +++
$