【问题标题】:Running ssh remote command and grep for a string为字符串运行 ssh 远程命令和 grep
【发布时间】:2014-10-11 00:05:39
【问题描述】:

我想编写可以远程运行一些 ssh 远程命令的脚本。我所需要的只是对某些特殊字符串执行命令的 grep 输出,这意味着该命令已成功执行。例如当我运行这个时:

ssh user@host "sudo /etc/init.d/haproxy stop"

我得到输出:

Stopping haproxy: [  OK  ]

我只需要找到“OK”字符串以确保命令成功执行。我该怎么做?

【问题讨论】:

    标签: bash shell ssh grep


    【解决方案1】:

    添加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
    

    【讨论】:

      猜你喜欢
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多