gpt4 book ai didi

bash - 为什么通过 ssh 传递带有引号空格的命令不起作用?

转载 作者:行者123 更新时间:2023-12-02 14:12:00 26 4
gpt4 key购买 nike

我正在构建这个项目,我必须在其中使用 ssh 执行 UNIX 命令。这是我的问题:当我在 UNIX shell 中执行以下命令时,

echo "Hello           World"

它产生输出:

Hello           World

参数之间有 5 个空格,因为参数是在双引号内给出的。我也想用 ssh 达到同样的效果。我正在尝试使用反斜杠转义双引号,如下所示:

ssh localhost echo \"Hello           World\"

因为我不想让 bash 处理引号。但它只是产生

Hello           World

“你好”后面只有一个空格这是为什么?

最佳答案

ssh 执行它通过调用远程 shell 给出的命令,该脚本使用由整套本地参数连接在一起的脚本组成,并在它们之间使用空格。


如果你运行:

# This has only syntactic quotes -- none of the quotes are literal.
ssh somehost echo "Hello World"

..然后这个传递给 ssh 的参数列表(在 C 语法中,不包括主机名和 ssh 命令本身)是 { "echo", "Hello World", NULL }

连接成一个字符串,然后变成 "echo Hello World"

因此,远程 shell 运行 echo Hello World,它没有语法引号。


如果你运行:

ssh somehost echo \"Hello   World\"

...那么命令列表(同样,在 C 语法中)是 { "echo", "\"Hello", "World\"", NULL }:引号是文字, 但在分词过程中,本地 shell(在运行 SSH 之前)删除了空格。

连接成一个字符串,这就变成了 echo "Hello World"。因此,您获得了报价,但失去了空间。


相比之下,作为一个有效(但不是特别最佳实践)的例子,请考虑:

ssh somehost echo \"Hello"   "World\"

在这里,您向 ssh 传递了两个参数:开头和结尾的 \" 是第一个 shell 的文字(没有语法意义,因此单词 Hello 是针对第一个未加引号的 shell);但是 " 只是围绕空白是语法上的,它告诉 shell 保留该空白(所以 空格 在调用 ssh 时被引用)。因此,您得到 { "echo", "\"Hello World\"", NULL },它连接到字符串 echo "Hello World"


最佳做法是通过仅将单个字符串传递给包含您要运行的整个脚本的 ssh 来避免此行为。

# This works
ssh somehost 'echo "Hello World"'

...如果您想以编程方式生成该字符串,您可以这样做(如果您知道您的远程 shell 是 bash——甚至是 bash-in-/bin/sh 模式是安全的):

remote_command=( echo "Hello   World" )
printf -v remote_command_q '%q ' "${remote_command[@]}"
ssh somehost "$remote_command_q"

要使用任何符合 POSIX 的远程 shell 安全地执行此操作,请参阅 How to have simple and double quotes in a scripted ssh command 中的 Python 辅助答案。

关于bash - 为什么通过 ssh 传递带有引号空格的命令不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46095421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com