Bash Can';t在curl-v telnet上使用grep-q

Bash Can';t在curl-v telnet上使用grep-q,bash,centos,Bash,Centos,尝试执行以下命令时: curl-v telnet docker.io:80 | grep-q'连接到docker.io' 我无法得到“有趣的部分”,在那里我只需要我想要grep的消息 我想使用内置的Centos命令而不是netcat来检查端口是否打开,因为它是需要在预安装时运行的脚本的端口。您可以使用curl简单地检查端口 r=$(curl docker.io:80 --connect-timeout 5 2>/dev/null; echo $?) if [ $r == 0 ]; th

尝试执行以下命令时:

curl-v telnet docker.io:80 | grep-q'连接到docker.io'

我无法得到“有趣的部分”,在那里我只需要我想要grep的消息


我想使用内置的Centos命令而不是netcat来检查端口是否打开,因为它是需要在预安装时运行的脚本的端口。

您可以使用curl简单地检查端口

r=$(curl docker.io:80 --connect-timeout 5 2>/dev/null; echo $?)
if [ $r == 0 ]; 
then 
  echo opened; 
else 
  echo closed;
fi
如果$r为0,则打开,否则关闭。
请注意,您可以根据自己的情况更改连接超时。

[$r==0]
通常存在错误。使用
[“$r”=0]
=
是POSIX标准化的,而
=
在dash或其他POSIX基线shell中不起作用;省略引号意味着如果
curl
echo
之前将内容写入stdout,则该内容将被视为
[
,这会使行为变得非常不可预测),或者更好,只要
如果curl…;那么
根本不使用
$?
。这正是我的观点。它是一个bash扩展,所以它不能与Debian、Ubuntu等常用的
/bin/sh
一起工作。如果你需要bash扩展,请一直使用
[[
——这样你就不会在左边引用错误&c.BTW,即使使用
if curl docker.io:80——连接超时5 2>/dev/null;然后echo打开;否则echo关闭;fi
,我也会担心当服务器在端口应答但不讲HTTP时,它是否会有非零退出状态——如果OP想要的话检查HTTP ness而不是open ness,可能他们不会要求
telnet
…是的,curl可能不会在stdout上返回任何内容,但也可能返回正文内容。如果您编写的代码只适用于OP在其示例中使用的一个web服务器……那么,这非常具体。谢谢Charles。我学到了很好的一点我想他想检查他的服务器的出站规则是否向docker打开。io:80。连接的
字符串被写入到stderr,而不是stdout。你只是管道stdout,所以
grep
永远看不到它……无论如何,有更好的方法来判断HTTP服务器是否工作;
如果curl——失败http://whatever
,第页他是你的朋友。