![在heredoc内设置变量,在heredoc外使用变量](https://linux22.com/image/73624/%E5%9C%A8heredoc%E5%86%85%E8%AE%BE%E7%BD%AE%E5%8F%98%E9%87%8F%EF%BC%8C%E5%9C%A8heredoc%E5%A4%96%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F.png)
我在 bash 脚本中有以下内容
ssh -T -i ${ssh_key} ${ssh_user}@${host} <<- 'EOF'
file=`hostname`.tar.gz
echo "file: " $file
### prints>> file: some-host-name.tar.gz
EOF
scp -i ${ssh_key} ${ssh_user}@${host}:${file} ~/incoming
### prints>> scp -i /home/user/.ssh/key.pem [email protected]: ~/incoming
我试图在heredoc中设置文件名,因为它基于我要连接的主机。然后我想使用该文件名将文件 scp 到另一个位置,但我无法在heredoc之外获取文件名。
建议?
答案1
这不是heredocs的问题。如果你运行:
ssh -i ${ssh_key} ${ssh_user}@${host} sh -c '
file=`hostname`.tar.gz
echo "file: " $file
'
效果是一样的。要点是:变量是在远程服务器上通过 SSH 启动的 shell 中评估的。它无法对本地 shell 上的变量产生任何影响。
因此,请执行以下操作:
file=$(ssh -i ${ssh_key} ${ssh_user}@${host} hostname).tar.gz
scp -i ${ssh_key} ${ssh_user}@${host}:${file} ~/incoming
答案2
remote_user_name=user
instance_ip=127.0.0.1
external=$(ls /home/)
ssh -T -i ${private_key} -l ${remote_user_name} ${instance_ip} << END
internal=\$(ls /home/)
echo "\${internal}"
echo "${external}"
END