이는 정상적인 리디렉션입니다.
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/22
stderr이 아직 리디렉션되지 않은 경우 오류가 출력됩니다. 다음 두 리디렉션의 순서를 변경하면 됩니다.
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