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/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模块中),这使它更直观,并且还允许更多功能,例如服务器端连接。

相关内容