脚本在"$ ssh bash 脚本参数"中看不到 arg



我希望看到两个命令都打印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

最新更新