【问题标题】:How to properly escape double quotes in an ssh pkill bash command? [duplicate]如何在 ssh pkill bash 命令中正确转义双引号? [复制]
【发布时间】:2018-10-19 00:09:17
【问题描述】:
$ 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 将其所有参数连接到一个字符串中,然后通过网络发送该字符串。
  • 因此,进入这些参数之间的边界的句法引用被完全丢弃——它被你的本地 shell 用来形成 ssh 的参数列表,但是 ssh 然后将这些信息丢弃:本地句法引用被本地 shell 丢弃,而在参数列表中传递的 literal 引号被远程 shell 视为语法。
  • 这是一个设计错误,但它是一个设计错误,只能通过新的有线协议(通过多个字符串而不是通过网络传递一个)来修复,所以它被修复的机会未来……几乎不可能。
  • @CharlesDuffy 事实证明引用 IS 完美!在意识到问题是 pkill 对 ssh 启动的 sh -c '... pkill -f "other process";...'process 是 自引用 之前,花了几个小时阅读有关 shell/ssh 引用转义过程的所有内容。大声笑
  • 需要以不同于本地命令的方式引用这一事实并不完美,如果 SSH 没有被错误设计,我上面所说的就是不必要的。

标签: bash ssh escaping heredoc quoting


【解决方案1】:

你最好使用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 对其进行解释

【讨论】:

  • 接受,因为这不会导致bash -c pkill\040-f\040"stalled\040process\040name";commands_to_restart;some_more_commands; 出现在服务器的命令行参数上并导致 pkill 杀死它自己的 shell 环境,这是我遇到的实际问题。跨度>
【解决方案2】:

试试:

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"

【讨论】:

  • 不接受,因为引用不是问题。这将导致 ssh 运行 bash -c pkill\040-f\040"stalled\040process\040name";commands_to_restart;some_more_commands;,因此 pkill 将杀死它自己的 shell 环境并阻止 commands_to_restart 的执行。
猜你喜欢
  • 2016-06-05
  • 2013-12-28
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2021-07-11
相关资源
最近更新 更多