ssh 远程命令执行引用

San*_*rix 5 ssh bash sed

我发现这个解决方案对我有用,但我不明白它是如何工作的,因为 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'
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么这样做,以及为什么我不需要转义 sed 命令的单引号 - 我在任何地方都找不到参考?谢谢。

moe*_*eye 6

你不需要,因为你的 sed 字符串不必被引用,事实上,在远程服务器上,它没有被引用。

作为参数传递给 ssh 命令的内容如下所示:

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
Run Code Online (Sandbox Code Playgroud)

它工作正常,因为 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'
Run Code Online (Sandbox Code Playgroud)

使用单引号,您不能像这样转义单引号: \'

你必须使用一个技巧。您必须关闭报价,转义'并重新打开报价。( '\'')