通过 bash 脚本将变量从一台机器传递到另一台机器的正确方法是什么?在下面的代码中,我试图从用户那里获取输入并希望将其传递给远程机器,但远程机器无法访问该值,有人可以告诉我正确的方法吗?
NEWLINE=$'\n'
read -s -p "Enter App FQDN:${NEWLINE}" APP_FQDN
read -s -p "Enter App Password:${NEWLINE}" APP_PASSWORD
read -s -p "Enter VD Password:${NEWLINE}" VD_PASSWORD
sshpass -p "$APP_PASSWORD" ssh -o StrictHostKeyChecking=no -T root@$APP_FQDN << 'EOSSH'
if true; then
su - presto << 'PRESTO'
source ~/.bash_profile
cd /opt/vm/vchs/presto_agent
pwd
KEY=$( cat /opt/vm/vchs/presto_agent/config/settings.yml |grep '^key:'|sed 's/^key: //')
echo $KEY
echo $VD_PASSWORD
PASSWORD=$(ruby /opt/vm/vchs/presto_agent/lib/obfuscation_util.rb encrypt $KEY $VD_PASSWORD)
echo $PASSWORD
PRESTO
else
echo "False"
fi
EOSSH
执行上述脚本时$VD_PASSWORD
会回显空白
答案1
我原来的答案
ssh VD_PASSWORD="$VD_PASSWORD" ...
是错误的,因为它没有考虑到 heredoc,并且将环境变量的设置放在了错误的位置。即使你将环境变量放在了正确的位置
ssh ... user@remote VD_PASSWORD="$VD_PASSWORD" <<'EOSSH' ...
由于存在此文档,它无法工作。
我让它工作了
VD_PASSWORD="$VD_PASSWORD"
ssh -o StrictHostKeyChecking=no -T user@remote <<EOSSH
echo $VD_PASSWORD
EOSSH
请注意 EOSSH 周围缺少什么'
,但这可能无法实现您想要的效果(我真的无法从脚本中看出)。
最好将脚本放在远程主机上,然后调用它
ssh ... VD_PASSWORD="$VD_PASSWORD" /path/to/remote/script
答案2
要传递环境变量,可能需要AcceptEnv
更改sshd_配置(5)以及SendEnv
ssh_配置(5)。