【发布时间】:2014-10-11 00:05:39
【问题描述】:
我想编写可以远程运行一些 ssh 远程命令的脚本。我所需要的只是对某些特殊字符串执行命令的 grep 输出,这意味着该命令已成功执行。例如当我运行这个时:
ssh user@host "sudo /etc/init.d/haproxy stop"
我得到输出:
Stopping haproxy: [ OK ]
我只需要找到“OK”字符串以确保命令成功执行。我该怎么做?
【问题讨论】:
我想编写可以远程运行一些 ssh 远程命令的脚本。我所需要的只是对某些特殊字符串执行命令的 grep 输出,这意味着该命令已成功执行。例如当我运行这个时:
ssh user@host "sudo /etc/init.d/haproxy stop"
我得到输出:
Stopping haproxy: [ OK ]
我只需要找到“OK”字符串以确保命令成功执行。我该怎么做?
【问题讨论】:
添加grep并检查退出状态:
ssh user@host "sudo /etc/init.d/haproxy stop | grep -Fq '[ OK ]'"
if [ "$#" -eq 0 ]; then
echo "Command ran successfully."
else
echo "Command failed."
fi
你也可以把grep放在外面。
ssh user@host "sudo /etc/init.d/haproxy stop" | grep -Fq '[ OK ]'
其他检查退出状态的方法:
command && { echo "Command ran successfully."; }
command || { echo "Command failed."; }
if command; then echo "Command ran successfully."; else echo "Command failed."; fi
您还可以捕获输出并将其与case 或[[ ]] 进行比较:
OUTPUT=$(exec ssh user@host "sudo /etc/init.d/haproxy stop")
case "$OUTPUT" in
*'[ OK ]'*)
echo "Command ran successfully."
;;
*)
echo "Command failed."
esac
if [[ $OUTPUT == *'[ OK ]'* ]]; then
echo "Command ran successfully."
else
echo "Command failed."
fi
如果需要,您可以将$(exec ssh user@host "sudo /etc/init.d/haproxy stop") 直接嵌入为表达式,而不是将输出传递给变量。
如果 /etc/init.d/haproxy stop 将消息发送到 stderr,只需将其重定向到 stdout 以便您可以捕获它:
sudo /etc/init.d/haproxy stop 2>&1
【讨论】: