我试图从远程服务器上提取 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|%CPU
grep
因此,如果这没有按预期工作,则可能有反斜杠数量之外的另一个原因。
您可以通过完全避免反斜杠来验证这一点,例如如下所示:
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。