Назад | Перейти на главную страницу

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, не анализируют переменные, которые я установил ранее. Очевидно, это связано с тем, что переменные устанавливаются не на удаленном компьютере, а только в моей локальной оболочке. Как я могу передать эти переменные или, возможно, передать несколько строк в 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"