Stdout/stderr 리디렉션은 /dev/tcp/host/port 리디렉션 오류를 방지하지 않습니다.

Stdout/stderr 리디렉션은 /dev/tcp/host/port 리디렉션 오류를 방지하지 않습니다.

이는 정상적인 리디렉션입니다.

user@linux:~$ randomcommand
randomcommand: command not found
user@linux:~$ 

2>

user@linux:~$ randomcommand 2> /dev/null
user@linux:~$ 

&>

user@linux:~$ randomcommand &> /dev/null
user@linux:~$ 

그러나 다른 명령을 사용하여 동일한 작업을 수행하려고 하면 아래와 같이 작동하지 않습니다.

&>

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

2>

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

이 구문에 어떤 문제가 있으며 어떻게 해결합니까?

답변1

bash리디렉션이 처리 중이고 > /dev/tcp/localhost/22stderr이 아직 리디렉션되지 않은 경우 오류가 출력됩니다. 다음 두 리디렉션의 순서를 변경하면 됩니다.

if 2> /dev/null > /dev/tcp/127.0.0.1/22; then
  echo open
else
  echo closed
fi

실제 파일 이 /dev/tcp/host/port아니라는 점에 유의하시기 바랍니다. bash(또는 ksh해당 기능의 소스)는 이러한 특수 파일로 리디렉션하려고 시도하고 있음을 감지하고(변경하거나 더 이상 작동하지 않는 경우 알 수 있음 /dev/./tcp) /dev//tcp이러한 파일을 여는 대신 TCP 소켓 단어를 생성하여 connect()시도합니다 . 호스트와 포트에서. connect실패 하면 bash오류가 보고됩니다 .

zsh모듈 ztcp에는 더 직관적이고 서버 측 연결과 같은 더 많은 기능을 허용하는 내장 명령이 있습니다 .zsh/net/tcp

관련 정보