![bash:将多行读入 ssh 时使用外部变量](https://linux22.com/image/800930/bash%EF%BC%9A%E5%B0%86%E5%A4%9A%E8%A1%8C%E8%AF%BB%E5%85%A5%20ssh%20%E6%97%B6%E4%BD%BF%E7%94%A8%E5%A4%96%E9%83%A8%E5%8F%98%E9%87%8F.png)
如果标题不能准确描述我所寻找的内容,我深感抱歉。如果可能,请进行修改。
我有一个执行以下操作的 bash 脚本:
serveruser="root"
serverip=1.2.3.4
serverpath="/var/www"
ssh "$serveruser"@"$serverip" /bin/bash <<\EOF
mkdir -p "$serverpath/mysqldumps/"
cd "$serverpath/mysqldumps/"
domainname=somedomain.com
mysqldump -h 192.168.1.4 -udba -ppassword -c --add-drop-table --add-locks --create-options --databases --quick --lock-tables $domainname > $domainname.sql
EOF
我的问题是,我“输入”到 ssh 的多行无法解析我之前设置的变量。这显然是因为变量不是在远程机器上设置的,而是在我的本地 shell 中设置的。我如何才能以不同的方式传递这些变量或将多行传递给 ssh?
答案1
您转义 here-doc 字的方式阻止了变量替换。对比
cat <<\END
$PATH
$LOGNAME
END
相对
cat <<END
$PATH
$LOGNAME
END
更新
仔细检查后,我发现你在 heredoc 中设置了一个变量。那应该不是本地机器上会扩展,因此您需要在 mysqldump 命令中转义这些内容。尝试以下操作:
ssh "$serveruser"@"$serverip" <<EOF
mkdir -p "$serverpath/mysqldumps/"
cd "$serverpath/mysqldumps/"
domainname=somedomain.com
mysqldump -h 192.168.1.4 -udba -ppassword -c --add-drop-table --add-locks --create-options --databases --quick --lock-tables \$domainname > \$domainname.sql
EOF
答案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
答案3
您需要引用整个命令..并且不需要引用变量,就像这样将它们放在 ${var} 中
serveruser="root"
serverip=1.2.3.4
serverpath="/var/www"
ssh ${serveruser}@${serverip} "/bin/bash <<\EOF
mkdir -p ${serverpath}/mysqldumps/
cd ${serverpath}/mysqldumps/
EOF"