如何在 ssh pkill bash 命令中正确转义双引号?

How to properly escape double quotes in an ssh pkill bash command?

$ ssh root@123.123.123.123
123.123.123.123# pkill -f "stalled process name"; commands_to_restart; some_more_commands;
many many lines of output demonstrating success
123.123.123.123# exit;

一切正常

$ ssh root@123.123.123.123 "pkill -f "\""stalled process name"\"";"\
> "commands_to_restart; some_more_commands;";

无输出,什么都不做。

$ ssh root@123.123.123.123 "echo "\""pkill -f "\"\\"\""stalled process name"\"\\"\""; "\
> "commands_to_restart; some_more_commands;"\"";";
pkill -f "stalled process name"; commands_to_restart; some_more_commands;

所以...引号转义的两个阶段按预期工作...

如何让单层引号转义以与 ssh/bash 一起使用? 由于引用在两层中完美工作,我感觉它与引用关系不大,而与 sshs 处理终端的某些方面有关。然而,据我所知,这些命令只对标准输出进行简单和常规的 IO 而没有输入。

尝试:

ssh root@123.123.123.123 'pkill -f "stalled process name"; commands_to_restart; some_more_commands'

使用单引号中的命令,无需转义内部双引号。

如果你更喜欢只使用双引号,那么内部双引号的单转义应该是令人满意的:

ssh root@123.123.123.123 "pkill -f \"stalled process name\"; commands_to_restart; some_more_commands"

你最好使用 heredoc 来做这样的事情:

ssh root@123.123.123.123 bash -s << 'EOF'
    pkill -f "stalled process name"
    commands_to_restart
    some_more_commands
EOF
  • bash -s 确保您使用的是 bash 而不是远程主机
  • 上的用户特定 shell
  • 引用 heredoc 结束标记 ('EOF') 确保内容按原样传递,父 shell 不解释它