首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么带引号空格的命令在ssh上传递时不能工作?

问为什么带引号空格的命令在ssh上传递时不能工作?
EN

Stack Overflow用户
提问于 2017-09-07 11:39:28
回答 2查看 1.5K关注 0票数 3

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

代码语言:javascript
复制
echo "Hello           World"

它产生的输出:

代码语言:javascript
复制
Hello           World

两者之间有5个空格作为参数,在双引号中给出。我也想用ssh达到同样的效果。我试图用反斜杠转义双引号,如下所示:

代码语言:javascript
复制
ssh localhost echo \"Hello           World\"

因为我不希望bash处理这些引号。但它只会产生

代码语言:javascript
复制
Hello           World

在“你好”之后只有一个空格,为什么?

EN

回答 2

Stack Overflow用户

发布于 2017-09-07 12:26:48

ssh通过调用远程shell执行它所给的命令,脚本由完整的本地参数集组成,并将它们之间的空格连接起来。

如果你跑:

代码语言:javascript
复制
# This has only syntactic quotes -- none of the quotes are literal.
ssh somehost echo "Hello   World"

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

连接到一个字符串中,这就变成了"echo Hello World"。

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

如果你跑:

代码语言:javascript
复制
ssh somehost echo \"Hello   World\"

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

连接成一个字符串,这就变成了echo "Hello World"。因此,你得到了引号,但失去了你的空格。

相反,作为一个工作(但不是最佳实践)的例子,请考虑:

代码语言:javascript
复制
ssh somehost echo \"Hello"   "World\"

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

最佳实践是通过只向ssh传递一个包含要运行的整个脚本的字符串来避免这种行为。

代码语言:javascript
复制
# This works
ssh somehost 'echo "Hello   World"'

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

代码语言:javascript
复制
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辅助答案。

票数 4
EN

Stack Overflow用户

发布于 2017-09-07 11:50:21

这些引号仅显示在客户机上,这意味着服务器看到了以下内容:

代码语言:javascript
复制
echo Hello     World

但是在这一点上引号已经丢失了,所以空格被折叠。

您可以在整个命令周围使用单引号:

代码语言:javascript
复制
ssh localhost 'echo "Hello     World"'

现在,本地shell不处理字符串,因此内部引号保持不变。

转义引号的情况意味着引号在本地shell上无效,因此空格在本地折叠,然后服务器看到:

代码语言:javascript
复制
echo "Hello World"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46095421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档