将子 shell 的输出重定向到进程

将子 shell 的输出重定向到进程

我正在尝试在 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

你想要一个流程替代例如ssh ... < <(...)ssh ... < $(my_command)是一个命令替换为每个创建一个重定向单词my_command来自作为重定向目标的结果。

答案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

参考

相关内容