bash:将多行读入 ssh 时使用外部变量

bash:将多行读入 ssh 时使用外部变量

如果标题不能准确描述我所寻找的内容,我深感抱歉。如果可能,请进行修改。

我有一个执行以下操作的 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"

相关内容