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

use*_*098 2 ssh bash escaping heredoc quoting

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

一切正常

$ ssh root@123.123.123.123 "pkill -f "\""stalled process name"\"";"\
> "commands_to_restart; some_more_commands;";
Run Code Online (Sandbox Code Playgroud)

没有输出,什么都不做。

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

所以......报价转义的两个阶段按预期工作......

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

cod*_*ter 5

你最好使用 heredoc 来处理这些事情:

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

  • 接受,因为这不会导致 `bash -c pkill\040-f\040"stalled\040process\040name";commands_to_restart;some_more_commands;` 显示在服务器上的命令行参数上并导致 pkill 杀死自己的 shell环境,这是我遇到的实际问题。 (2认同)