2016-04-30 64 views
-1

我尝试下面的命令,并得到了一个错误:挑战:为逃避SSH大括号命令

$ ssh -q rmthost "bash -c 'cat /var/tmp/5|awk '''{print \$1}''' >/var/tmp/redirect 2>&1'" 
Missing } 

(注:“庆典-c'是必要的,因为对rmthost帐户的登录shell是csh )

禁用括号扩展不起作用:

$ set +B 

我也试过:

$ ssh -q rmthost "bash -c 'cat /var/tmp/5|awk ''''{'print \$1'}''''>/var/tmp/redirect 2>&1'" 
awk: syntax error near line 1 
awk: illegal statement near line 1 

中级脚本文件会做,但我更喜欢单行程序,因为我有10多个这样的类似命令需要在不同的时间点运行。

有没有办法在这种情况下逃避大括号?

谢谢。

+0

单引号会阻止变量扩展。很可能你根本不需要任何转义 – user3159253

+0

bash -c字符串已经有单引号,所以awk命令中的单引号也需要转义。这是棘手的部分。 – AlexL

回答

3

我玩了一小会儿......我想你真正想做的是“简化”。我的本地shell是bash,而我的远程是tcsh ...这是我想到的功能(与您的文件名一致)。

ssh -q rmthost "awk '{ print \$1 }' /var/tmp/5" 

壳牌逃逸足够棘手,你真的要想想“为什么”你想要做这样的事情(在尊重,比方说,要撬动一个中间脚本文件)。

也许更好的是使用切?

ssh -q rmthost 'cut -f1 /var/tmp/5' 

如果外壳封装和重定向是绝对必要的...(请注意:符号逃生。)

ssh -q rmthost "sh -c \"awk '{ print $1 }' /var/tmp/5\" \&> /var/tmp/redirect" 
+0

嗨迈克,我需要bash -c员工因为远程登录shell是csh,而我想在rmthost上运行的真实命令包括bash样式输出重定向,如2>&1。它可以通过中间脚本文件来完成。但我更喜欢命令行,因为我有很多不同的命令在不同的时间点在远程服务器上运行...... – AlexL

+0

我在我的答案中添加了一个条款...对我来说,关键只是从简化版本。最后一个技巧是逃避&符 - 可能这是一个csh的事情。由于我的设置与您的设置非常接近,所以我的脚本很可能会起作用(并且直接回答您的问题),但我也鼓励您也看看jil的答案,因为他/她可以让您编写多行脚本更方便。真正的答案可能在两者之间。 –

0

与定界符(也没用使用猫的淘汰)尝试:

ssh -q rmthost <<'EOI' 
bash -c "awk '{print $1}' </var/tmp/5> /var/tmp/redirect 2>&1" 
EOI