尝试通过 ssh 远程执行字符串,但我的反斜杠不断重复

尝试通过 ssh 远程执行字符串,但我的反斜杠不断重复

我试图从远程服务器上提取 PMD(轮询模式驱动程序)上的 cpu 数据,它应该是这样的:

pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU
01:48:19 PM   UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
01:48:20 PM   997         -     28553    0.00    0.00    0.00    0.00    14  |__pmd8
01:48:20 PM   997         -     28555  100.00    0.00    0.00  100.00    27  |__pmd9
01:48:20 PM   997         -     28556  100.00    1.00    0.00  100.00    38  |__pmd10
01:48:20 PM   997         -     28557    0.00    0.00    0.00    0.00    39  |__pmd12
01:48:20 PM   997         -     28558  100.00    0.00    0.00  100.00     2  |__pmd11
01:48:20 PM   997         -     28559  100.00    0.00    0.00  100.00    15  |__pmd14
01:48:20 PM   997         -     28560  100.00    1.00    0.00  100.00     3  |__pmd13
01:48:20 PM   997         -     28561  100.00    0.00    0.00  100.00    26  |__pmd15
Average:      UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
Average:      997         -     28553    0.00    0.00    0.00    0.00     -  |__pmd8
Average:      997         -     28555  100.00    0.00    0.00  100.00     -  |__pmd9
Average:      997         -     28556  100.00    1.00    0.00  100.00     -  |__pmd10
Average:      997         -     28557    0.00    0.00    0.00    0.00     -  |__pmd12
Average:      997         -     28558  100.00    0.00    0.00  100.00     -  |__pmd11
Average:      997         -     28559  100.00    0.00    0.00  100.00     -  |__pmd14
Average:      997         -     28560  100.00    1.00    0.00  100.00     -  |__pmd13
Average:      997         -     28561  100.00    0.00    0.00  100.00     -  |__pmd15

这是我发送到远程服务器的命令字符串:

ssh -vvvv  [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'

这就是我看到的发送内容:

pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\\|%CPU

除了双反斜杠之外,一切都是正确的,它应该只是单斜杠。

答案1

看起来 SSH 只是依赖于它实际向服务器发送了多少个反斜杠。让我们看一些简单的例子:

ssh -v juha@goliath 'echo h\ello'
...
debug1: Sending command: echo h\\ello
hello
...


ssh -v juha@goliath 'echo h\\ello'
...
debug1: Sending command: echo h\\\\ello
h\ello
...


ssh -v juha@goliath 'echo h\\\ello'
...
debug1: Sending command: echo h\\\\\\ello
h\ello
...


ssh -v juha@goliath 'echo h\\\\ello'
...
debug1: Sending command: echo h\\\\\\\\ello
h\\ello
...

看起来,SSH 正确地将引用的命令传递到远程 shell,因为后者输出的正是我们在本地执行命令时所得到的结果。

另一方面,SSH 似乎盲目地将其调试消息中的反斜杠数量加倍。如果引入额外的引用级别(例如

ssh -v juha@goliath "echo 'h"'\\'"ello'"
...
debug1: Sending command: echo 'h\\\\ello'
h\\ello
...

为了使最后一个示例的引用方案更加清晰: SSH 命令中的最后一个参数是三个字符串的串联:"echo 'h"'\\'"ello'"。本地 shell 将其转换为echo 'h\\ello'先将其传递给 SSH。

现在请执行您的命令:

ssh -vvvv  [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'

前面有两个单引号pidstat。这会导致pidstat -t -p不被引用,但这应该没有什么害处。因此,从上面来看,远程 shell 很可能正确接收最后一个参数,将其转换为grep根据需要传递的pmd\|%CPU扩展正则表达式。pmd|%CPUgrep

因此,如果这没有按预期工作,则可能有反斜杠数量之外的另一个原因。

您可以通过完全避免反斜杠来验证这一点,例如如下所示:

ssh -v [email protected] 'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '"'pmd|%CPU'"

这里最后一个参数是两个字符串的串联:'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '"'pmd|%CPU'"。本地 shell 将其转换pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E 'pmd|%CPU'并传递给 SSH。

相关内容