2015-05-14 117 views
2

嵌套引用运行shell命令我有这样的shell命令:已通过ssh

ssh [email protected] "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 

感谢

+0

的可能重复[如何逃脱的SSH /远程bash命令的单引号字符?(HTTP:/ /stackoverflow.com/questions/20498599/how-to-escape-the-single-quote-character-in-a-ssh-remote-bash-command) – 2015-05-14 10:39:55

+0

请注意,唯一必须在远程服务器上运行的是'df'命令。 'grep'可以在本地运行,尽管在远程服务器上运行它会减少发回的数据量(而不是'df'产生*那么多的数据)。其余的你可以在本地执行。 – chepner

回答

6

带引号的定界符允许省略外报价:

ssh [email protected] <<'END' 
df | grep /dev/ | awk 'BEGIN{print "DISK", "%USAGE", "STATUS"} {split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t 
END 
+0

@ glen jackman,谢谢你的解答。 – Yash

3

这是这里文件来得方便的情况:

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

感谢您的解决方案。 – Yash

1

这是更简单,只是用awk运行df | grep远程,并处理输出本地:

ssh [email protected] 'df | grep /dev' | awk ' 
    BEGIN{print "DISK", "%USAGE", "STATUS"} 
    {split($5, a, "%"); var="GREEN"; print $1, $5, var}' | column -t 
+0

我正在将其与基于HTTP的监视工具进行集成,该工具的框架不允许本地处理。那么我可以做到这一点,但我正在寻找一个更简单的解决方案。 – Yash

+0

这是远程运行一切的一个很好的理由:) – chepner

+0

是的,只是得到结果和显示就简单多了。上述命令仅仅是一个较大命令的一小部分,它有一个温和复杂的逻辑,根据“%used”改变“STATE”的值。 – Yash