我希望看到两个命令都打印hello
$ bash -l -c "/bin/echo hello"
hello
$ ssh example_host bash -l -c /bin/echo hello
$
如何在ssh
命令中将hello
作为参数传递?
需要bash -l -c
,因此执行登录shell启动脚本。
让ssh
启动登录shell也可以解决这个问题。
当您在-c
之后传递额外的args时,它们会在执行该命令时放入shell的argv中。你可以这样看:
bash -l -c '/bin/echo "$0" "$@"' hello world
因此,这些参数不会放在echo的命令行上(除非您特意这样做),而是放在shell的命令行上,您要告诉shell在没有参数的情况下运行echo。
也就是说:当你运行时
bash -l -c /bin/echo hello
这相当于
(exec -a hello bash -c /bin/echo)
其将CCD_ 7放入仅运行CCD_ 9的bash的CCD_。由于运行/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