脚本没有在' $ ssh bash脚本arg'中看到arg。

时间:2014-10-10 17:12:09

标签: bash ssh

我想看到两个命令都打印hello

$ bash -l -c "/bin/echo hello"
hello
$ ssh example_host bash -l -c /bin/echo hello

$

如何将hello作为ssh命令中的参数传递?

需要bash -l -c,因此执行登录shell启动脚本。

ssh启动登录shell也可以解决问题。

1 个答案:

答案 0 :(得分:2)

当你在-c之后传递额外的args时,它们会在执行该命令时被放入shell的argv中。你可以这样看:

bash -l -c '/bin/echo "$0" "$@"' hello world

...所以,这些参数没有放在 echo 的命令行上(除非你不顾一切地这样做),而是放在命令行上<你告诉你运行echo 而没有参数的shell 的em>。

也就是说:当你跑步时

bash -l -c /bin/echo hello

......这相当于:

(exec -a hello bash -c /bin/echo)

...将hello放入仅运行$0的bash的/bin/echo。由于正在运行/bin/echo并未查看$0,因此当然不会打印hello


现在,因为通过ssh执行操作意味着你要经历两个shell扩展步骤,所以它增加了一些额外的复杂性。幸运的是,您可以自动为您设置shell句柄,如下所示:

printf -v cmd_str '%q ' bash -l -c '/bin/echo "$0" "$@"' hello world
ssh remote_host "$cmd_str"

这告诉bash(printf %q是一个bash扩展,在POSIX printf中不可用)来引用你的命令,使它在被shell处理时扩展为自身,然后将结果提供给ssh


所有这一切 - 将$0视为常规参数是不好的做法,通常不应该在没有特定和令人信服的理由的情况下进行。正确的事情更像是:

printf -v cmd '%q ' /bin/echo hello world  # your command
printf -v cmd '%q ' bash -l -c "$cmd"      # your command, in a login shell
ssh remotehost "$cmd"                      # your command, in a login shell, in ssh