我想看到两个命令都打印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也可以解决问题。
答案 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