ssh远程命令执行引用

我发现这个解决scheme适用于我,但我不明白它是如何工作的,因为sed命令在单引号中包含了自己的参数,并且整个ssh命令也在单引号中传递。 这是从OSX(bsd)运行。

ssh -t -p 22 root@thehost 'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i 's/^RS=paper_lantern$/RS=x3/' /var/cpanel/users/${user}; fi; done' 

有人可以向我解释为什么这个工作,为什么我不需要逃避sed命令的单引号 – 我找不到任何地方的参考? 谢谢。

你不这样做,因为你的sedstring不需要被引用,实际上,在远程服务器上,它没有被引用。

什么传递给你的ssh命令的参数如下所示:

 for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -is/^RS=paper_lantern$/RS=x3/ /var/cpanel/users/${user}; fi; done 

它工作正常,因为你的sed命令的参数里面没有空格。

如果你想传递一个空格sed参数,你应该像这样逃避你的单引号:

 'for user in $(/bin/ls -A1 /var/cpanel/users) ; do if grep -q RS=paper /var/cpanel/users/${user}; then sed -i '\''s/^RS=paper_lantern$/RS=x3/'\'' /var/cpanel/users/${user}; fi; done' 

用单引号,你不能逃避这样的单引号: \'

你必须使用一个技巧。 你必须closures报价,逃避你'和重新开放的报价。 ( '\''