Прошу прощения, если заголовок не совсем описывает то, что я ищу. Пожалуйста, отредактируйте, если возможно.
У меня есть сценарий 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, не анализируют переменные, которые я установил ранее. Очевидно, это связано с тем, что переменные устанавливаются не на удаленном компьютере, а только в моей локальной оболочке. Как я могу передать эти переменные или, возможно, передать несколько строк в ssh другим способом?
То, как вы избегаете слова 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
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
Вам нужно заключить в кавычки всю команду .. и не нужно заключать в кавычки такие переменные, поместите их как $ {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"