我正在尝试在 SSH 中执行脚本,并将一些参数传递给该脚本。我尝试了以下方法,但没有成功 - 该值未传递:
$ LC_FOO=x ssh -o SendEnv=LC_FOO $HOST < myLongScript.sh
目标主机有时非常严格并定期重新创建,因此更改其上的 SSH 设置是徒劳的。
因此,我尝试采用一种技巧并在脚本本身内传递值。换句话说,我想将变量附加到脚本中。
我还尝试过其他方法:
# doesn't work - 'ambiguous redirect'
$ ssh ... < $(...)
# doesn't work - 'LC_FOO=x: command not found'
$ $(echo "FOO=x"; cat myLongScript.sh) | ssh ...
如何在ssh
的输入前面添加该行?
答案1
答案2
LC_FOO
如果您启用该变量,使其位于AcceptEnv
服务器端/etc/ssh/sshd_config
文件的列表中,则第一个示例将起作用。
$ grep AcceptEnv /etc/ssh/sshd_config
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
AcceptEnv LC_FOO
现在它可以工作了:
$ LC_FOO=x ssh -o SendEnv=LC_FOO [email protected] 'printenv LC_FOO'
x
备择方案
重定向方法我在另一篇 U&L 问答中展示了这一点,标题为:如何在远程计算机上执行本地脚本并包含参数?,对于你的例子,我建议这样做:
$ ssh serverA "bash -s" -- < ./ex.bash "arg1" "arg2"
定理法
你也可以使用heredoc风格,我在另一个U&L Q&A标题中强调了这一点:在 shell 脚本中查看 $PATH 的远程值:
[root@skinner ~]# ssh mulder 'bash -s <<EOL
> echo $HOSTNAME
> hostname
> EOL'
mulder.bubba.net
mulder.bubba.net