【问题标题】:Can't use grep -q on curl -v telnet [duplicate]不能在 curl -v telnet 上使用 grep -q [重复]
【发布时间】:2019-07-16 09:48:27
【问题描述】:

尝试执行以下命令时:

curl -v telnet docker.io:80 | grep -q 'connected to docker.io'

我无法获得“有趣的部分”,我只需要我想要 grep 的消息。

Screenshot

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

【问题讨论】:

  • connected 字符串写入标准错误,而不是标准输出。你只是在输出标准输出,所以grep 永远不会看到它。
  • ...无论如何,有更好的方法来判断 HTTP 服务器是否在工作; if curl --fail http://whatever,尤其是你的朋友。

标签: bash centos


【解决方案1】:

您可以简单地使用 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 标准化的,而 == 不是而且在破折号或其他 POSIX 基线外壳中也不起作用;省略引号意味着如果curl 在@987654327 之前将内容写入标准输出@,您将把该内容视为[ 的额外参数,这会使行为变得非常不可预测),或者甚至更好,只是if curl ...; then,根本不使用$?
  • 正是我的观点。它是一个 bash 扩展,因此它不适用于 Debian、Ubuntu 等常用的 /bin/sh。如果你需要 bash 扩展,请一直使用 [[——这样你没有在左侧 &c 引用失败的错误。
  • 顺便说一句,即使使用if curl docker.io:80 --connect-timeout 5 2>/dev/null; then echo opened; else echo closed; fi,我也会担心当服务器在端口回答但不说 HTTP 时它是否会具有非零退出状态——如果 OP 想要检查对于 HTTP-ness 而不是开放性,大概他们不会要求 telnet
  • ...是的,curl 可能在标准输出上不返回任何内容,但它也可能返回正文内容。如果您编写的代码仅适用于 OP 在他们的示例中使用的一个 Web 服务器......那么,这非常具体。
  • 谢谢查尔斯。我从你那里学到了好点。我想他想检查一下他的服务器的出站规则是否对 docker.io:80 开放。
猜你喜欢
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 2020-10-20
  • 2014-06-15
  • 1970-01-01
  • 2016-03-28
相关资源
最近更新 更多