【问题标题】:Running shell command that has nested quotes via ssh通过 ssh 运行具有嵌套引号的 shell 命令
【发布时间】:2015-07-25 21:43:12
【问题描述】:

我有以下 shell 命令:

ssh user@host "df | grep /dev/ | \
awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} {split($5, a, "%"); \
var="GREEN"; print $1, $5, var}' | column -t"

我需要在 ssh 上运行它,但由于存在嵌套的双引号和单引号而出现语法错误。

我在引号的开头和结尾尝试了转义字符,但没有解决问题。

但是,在本地系统上运行这将给出以下输出:

$ df | grep /dev/ | \
awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} {split($5, a, "%"); \
var="GREEN"; print $1, $5, var}' | column -t
DISK       %USAGE  STATUS
/dev/sda1  95%     GREEN

【问题讨论】:

标签: bash shell quoting


【解决方案1】:

引用的 heredoc 允许您省略外部引号:

ssh user@host <<'END'
df | grep /dev/ | awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} {split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t
END

【讨论】:

    【解决方案2】:

    这就是这里文档派上用场的情况:

    ssh -t -t user@host<<'EOF'
    df | awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} /dev/{split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t
    EOF
    

    【讨论】:

    • 感谢您的解决方案。
    【解决方案3】:

    远程运行df | grep,并使用awk在本地处理输出要简单得多:

    ssh user@host 'df | grep /dev' | awk '
        BEGIN{print "DISK", "%USAGE", "STATUS"}
        {split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t
    

    【讨论】:

    • 我正在将此与基于 HTTP 的监控工具集成,该工具的框架不允许本地处理。好吧,我可以做到,但我正在寻找更简单的解决方案。
    • 是的,获取结果和显示要简单得多。上面的命令只是一个较大命令的一小部分,它有一个稍微复杂的逻辑来根据“%used”改变“STATE”的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2015-06-08
    • 2013-11-22
    • 2015-07-24
    • 1970-01-01
    • 2014-08-21
    • 2013-08-24
    相关资源
    最近更新 更多