bash: use variáveis externas ao ler várias linhas no ssh

2

Peço desculpas se o título não descrever bem o que estou procurando. Por favor, edite se possível.

Eu tenho um script bash que faz o seguinte:

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

Meu problema é que as várias linhas que estou "alimentando" para o ssh não analisam as variáveis que eu configurei antes. Isto é obviamente porque as variáveis não estão definidas na máquina remota, apenas no meu shell local. Como eu poderia passar essas variáveis ou possivelmente passar várias linhas para o ssh de uma maneira diferente?

    
por senorsmile 18.04.2013 / 19:56

2 respostas

2

A maneira como você está escapando da palavra here-doc está evitando a substituição de variáveis. Contraste

cat <<\END
$PATH
$LOGNAME
END

versus

cat <<END
$PATH
$LOGNAME
END

atualização

Em uma inspeção mais detalhada, vejo que você está definindo uma variável no heredoc. Isso deve não ser expandido na máquina local, então você precisa escapar daqueles no comando mysqldump. Tente isto:

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
    
por 18.04.2013 / 20:26
0

Você precisa citar todo o comando. e não é necessário citar as vars como essas, como $ {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"
    
por 18.04.2013 / 20:09

Tags