我正在构建这个项目,在这个项目中,我必须使用ssh执行UNIX命令。下面是我的问题:当我在UNIX中执行以下命令时,
echo "Hello World"它产生的输出:
Hello World两者之间有5个空格作为参数,在双引号中给出。我也想用ssh达到同样的效果。我试图用反斜杠转义双引号,如下所示:
ssh localhost echo \"Hello World\"因为我不希望bash处理这些引号。但它只会产生
Hello World在“你好”之后只有一个空格,为什么?
发布于 2017-09-07 12:26:48
ssh通过调用远程shell执行它所给的命令,脚本由完整的本地参数集组成,并将它们之间的空格连接起来。
如果你跑:
# 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,它没有语法引号。
如果你跑:
ssh somehost echo \"Hello World\"...then命令列表(在C语法中同样如此)是{ "echo", "\"Hello", "World\"", NULL }:引号是字面的,但是在分字过程中,本地shell (运行SSH之前)删除了空格。
连接成一个字符串,这就变成了echo "Hello World"。因此,你得到了引号,但失去了你的空格。
相反,作为一个工作(但不是最佳实践)的例子,请考虑:
ssh somehost echo \"Hello" "World\"在这里,您要传递两个参数:开头和结尾的ssh s对第一个shell是字面的(没有语法意义,因此单词Hello是第一个没有引号的shell );但是"只是围绕空格的语法,并告诉shell在调用ssh时保留空格(因此空格是引号)。因此,您将得到{ "echo", "\"Hello World\"", NULL },它连接到字符串echo "Hello World"。
最佳实践是通过只向ssh传递一个包含要运行的整个脚本的字符串来避免这种行为。
# This works
ssh somehost 'echo "Hello World"'要以编程方式生成该字符串的...if,您可以这样做(如果您知道远程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辅助答案。
发布于 2017-09-07 11:50:21
这些引号仅显示在客户机上,这意味着服务器看到了以下内容:
echo Hello World但是在这一点上引号已经丢失了,所以空格被折叠。
您可以在整个命令周围使用单引号:
ssh localhost 'echo "Hello World"'现在,本地shell不处理字符串,因此内部引号保持不变。
转义引号的情况意味着引号在本地shell上无效,因此空格在本地折叠,然后服务器看到:
echo "Hello World"https://stackoverflow.com/questions/46095421
复制相似问题