我正在编写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之后。
由于
答案 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个参数作为环境变量传递。
假设您要使用名称PARAM1
和PARAM2
。服务器上的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