运行通过ssh嵌套引号的shell命令

时间:2015-05-14 10:06:23

标签: bash shell quoting

我有以下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

3 个答案:

答案 0 :(得分:6)

引用的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

答案 1 :(得分:3)

这是这里文件方便的案例:

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

答案 2 :(得分:1)

远程运行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