首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Stdout / stderr重定向无法防止/dev/tcp/host/port重定向错误

Stdout / stderr重定向无法防止/dev/tcp/host/port重定向错误
EN

Unix & Linux用户
提问于 2020-02-05 06:37:01
回答 1查看 985关注 0票数 2

这是正常的重定向。

代码语言:javascript
运行
复制
user@linux:~$ randomcommand
randomcommand: command not found
user@linux:~$ 

2>

代码语言:javascript
运行
复制
user@linux:~$ randomcommand 2> /dev/null
user@linux:~$ 

&>

代码语言:javascript
运行
复制
user@linux:~$ randomcommand &> /dev/null
user@linux:~$ 

但是,当我试图对不同的命令执行相同的操作时,它无法工作,如下所示。

&>

代码语言:javascript
运行
复制
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>

代码语言:javascript
运行
复制
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:~$ 

这些语法有什么问题,以及如何修复它?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-02-05 06:48:41

bash处理> /dev/tcp/localhost/22重定向时,将输出该错误,此时stderr尚未被重定向。只需更改这两个重定向的顺序:

代码语言:javascript
运行
复制
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模块中),这使得它更加直观,并且还允许服务器端连接等更多的东西。

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/565844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档