Estoy tratando de crear un sync.sh
Script que coordina con nuestro control de versión menos que ideal para nuestro sitio web. Este script migrará una copia en vivo de la base de datos a nuestro entorno de desarrollo y un par de cosas más. Estoy teniendo problemas con la parte de migración de mysql.
Este script se ejecuta en una máquina de desarrollo. remote
es el anfitrión en vivo.
# --------------
# database
# ssh tunnel
ssh -L 3307:remote:3306 user@remote
# mysql dump
mysqldump -u someuser -h remote -P 3307 -p"p4ssw0rd" db > localfile.sql
# somehow close ssh tunnel ???
# populate local db with sql dump file
mysql -ulocal db < localfile.sql
# -----------------
# other sync stuff
# ...
Cuando acabo de ejecutar la parte mysql de la secuencia de comandos, obtengo esta salida:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Enter password:
Tenemos configuración de teclas ssh y puedo ssh al control remoto correctamente. Sin embargo, cuando se ejecuta en el contexto del script, las cosas van mal. Creo que soy un total bash noob. Supongo que si simplemente cambio la estructura de mi enfoque, no debería tener ningún problema. Simplemente no estoy seguro de cómo hacer eso ...
fuente
mysqldump
está instalado en la máquina remota y es la versión deseada, etc.los
ssh -L 3307:remote:3306 user@remote
el comando nunca volverá, porque solo abrirá un shell y lo mantendrá abierto.SSH se comporta de la siguiente manera: Mantiene la conexión abierta mientras se ejecute un comando o se use el túnel. Entonces lo que quieres hacer es
ssh user@remote sleep 10 &
. Esto le da al comando mysqldump el tiempo suficiente para abrir la conexión, pero tan pronto como mysqldump cierra esa conexión, el túnel no se utiliza y SSH sale.por cierto, puede que tenga que usar 3307: localhost: 3306, si el servidor no permite conexiones externas. (Esto funciona porque el nombre de host se resuelve en el lado del servidor, no en su cliente)
fuente
-f
en lugar de&
permite ingresar una contraseña primeroQuizás se justifique otro enfoque: dos guiones. La secuencia de comandos A sería la secuencia de comandos que debe ejecutarse en el host remoto. El script B sería un script de control que 1) copia Sctipt A al servidor remoto, 2) SSHs al servidor remoto y ejecuta el script copiado, 3) copia el archivo de volcado resultante y 4) carga la db local
fuente