如何在bash脚本中将局部变量传递给ssh作用域?

时间:2016-10-06 07:10:48

标签: linux bash ssh

我正在编写bash脚本,它必须通过ssh在远程服务器上执行一些命令。该脚本有两个主要部分:

第1部分: 使用局部变量$ A和$ B

第2部分: 在远程服务器上执行命令,如下所示:

ssh -T user@servername << 'EOF' ... Using local variables $A and $B ... EOF

问题是本地变量$ A和$ B在远程服务器上的ssh命令范围内不可用。据我所知,变量$ A和$ B在ssh范围之外和之内是不一样的。

所以我的问题是如何将局部变量从bash脚本传递到ssh范围? 还有一点需要注意,第2部分非常大,所以我不能使用&#34;一个衬垫&#34;在ssh之后。

由于

2 个答案:

答案 0 :(得分:0)

可能有一种方法可以直接告诉ssh使用局部变量但是我会快速回答并提到你可以使用一个脚本来包装ssh,其代码可以远程插入变量,一旦你有权访问它们控制命令提示符。

答案 1 :(得分:0)

该问题与ssh无关,但仅与bash或任何其他Posix shell中的 here documents 有关。

bash的man页面在这里的文档段落中说:

  

here-documents的格式为:

     

&LT;&LT; [ - ]字
              这里文档
      定界符

     

不对字执行参数扩展,命令替换,算术扩展或路径名扩展。 如果引用了单词中的任何字符,则分隔符是单词上引号删除的结果,而此处文档中的行未展开。如果word不加引号,则here-document的所有行都要进行参数扩展,命令替换和算术扩展。在后一种情况下,将忽略字符序列\<newline>,并且\必须用于引用字符\$和`。

当您引用EOF时,您明确要求shell不要替换$1$2变量。

最强大的方法是不引用EOF并在此处的文档中始终引用所有其他特殊字符。

例如,如果您的此处文档包含以下内容:

ssh -T user@servername << 'EOF'
for f in /var/log/messages*
do echo "Filename: " $f
done
EOF

你可以在EOF周围没有引号但是在$内有一个引号来重写它:

ssh -T user@servername << EOF
for f in /var/log/messages*
do echo "Filename: " \$f
done
EOF

这样就可以插入所有未引用的变量。

或者,如果服务器允许,您可以尝试将2个参数作为环境变量传递。

假设您要使用名称PARAM1PARAM2。服务器上的sshd_config文件应包含行AcceptEnv PARAM1 PARAM2,因为默认情况下出于安全原因,不接受任何环境变量。

然后您可以使用:

export PARAM1=$1
export PARAM2=$2
ssh -T -o SendEnv=PARAM1 -o SenEnv=PARAM2 user@servername  << 'EOF'
...
Using variables $PARAM1 and $PARAM2
...
EOF