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

时间:2018-05-09 00:10:26

标签: bash ssh 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;

所有工作都完美

$ 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? 由于引用在两个层中完美地工作,我感觉它与引用关系较少,而更多地与ssh处理终端的某些方面有关。然而,据我所知,除了简单和常规的IO标准输出和没有输入之外,命令什么都不做。

2 个答案:

答案 0 :(得分:4)

最好使用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不会解释它

答案 1 :(得分:1)

尝试:

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"