我试图理解grep -v grep
下面的内容:
ssh $server -p $port -o "ConnectTimeout 5" | grep -v "Connection refused" | grep "Connected to" | grep -v grep | wc -l
或者有没有更好的方法来查找TCP连接测试?
答案1
如果你想检查是否可以在 5 秒内建立 ssh 连接并运行命令,只需执行以下操作:
if ssh -o BatchMode=yes -o ConnectTimeout=5 -p "$port" "$server" true; then
printf '%s\n' "$server is up"
fi
你的命令本身没有什么意义。由于您没有提供在远程服务器上运行的命令,因此将以请求伪终端并启动远程用户的登录 shell(或可能是 ForcedCommand)的模式ssh
运行。rlogin
然后,您对输出应用多个过滤器:
grep -v "Connection refused"
:过滤掉其中的任何行输出其中包含Connection refused
.这没有什么意义,因为如果出现错误消息,它会写在 stderr 上,而不是正在过滤的标准输出上grep
,而且还因为:grep "Connected to"
:仅选择包含 的行Connected to
。这也会排除包含的行,Connection refused
因为一行不太可能同时包含两者。grep -v grep
,还要删除包含的行grep
(这样就成为同时包含Connected to
andgrep
和 not的行Connection refused
!)wc -l
:计算结果行的数量(因此ssh
的 stdout 中包含的行Connected to
除外,也包含grep
或Connection refused
)。请注意,wc
仅当连接关闭时、shell 会话终止时(例如用户输入 时)才会输出该数字exit
。但话又说回来,由于用户不会看到任何输出(因为这一切wc
最终都会发生),因此用户几乎不知道他需要输入exit
才能终止该会话。
答案2
grep
它排除包含先前管道输出中的字母序列的所有行。