【发布时间】: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