1

~/echo.sh假设我在远程服务器上有一个包含以下内容的脚本example.com

#!/usr/bin/env bash
echo "Arg 1: $1"
echo "Arg 2: $2"
echo "Arg 3: $3"
echo "Arg 4: $4"

现在,在我的本地机器上,我有另一个脚本,remote-echo.sh其内容如下:

#!/usr/bin/env bash
ssh example.com "~/echo.sh $*"

这个想法是用户应该能够remote-echo.sh使用任何参数运行并将这些参数转发到~/echo.sh远程服务器上。

不幸的是,这不起作用:

$ ./remote-echo.sh "arg with space" "argwith\"quote" "arg3"
bash: -c: line 0: unexpected EOF while looking for matching `"'
bash: -c: line 1: syntax error: unexpected end of file

我该如何解决?我已经尝试过使用$@而不是$*,但这对结果根本没有任何影响。

4

1 回答 1

4

您需要确保传递给 SSH 的字符串中嵌入的所有参数都被正确转义,因此它们不会被远程服务器上的 shell 解释。最简单的方法是在 Bash中使用%q格式字符:printf

#!/usr/bin/env bash
ssh example.com "~/echo.sh $(printf "%q " "$@")"

根据helpBash 中 printf 的信息:

除了 printf(1) 中描述的标准格式规范之外,printf 还解释:

[...]

%q 以一种可以作为 shell 输入重用的方式引用参数

这应该可以解决您在此处看到的问题,并确保每个参数都正确传递给echo.sh.

于 2018-07-26T21:28:16.537 回答