¿Por qué este script de shell falla en bash, pero los comandos funcionan en SSH?

¿Por qué este script de shell falla en bash, pero los comandos funcionan en SSH?

Lo que estoy intentando escribir es un script de shell que hará una copia de seguridad de un sitio web y de todas las bases de datos MySQL que lo admiten. Encontré ejemplos en toda la red, pero cuando ejecuto el script en bash en una sesión SSH encarcelada, falla. Si escribo los comandos directamente en la sesión SSH, funcionan bien.

#!/bin/sh

DB1="first_db"
THEDATE=$(date +"%Y-%m-%d")
THEUSER=user
THEDBPW=password

mysqldump -u $THEDBUSER -p$THEDBPW $DB1 > dbbackup_$DB1_$THEDATE.sql

tar -czf sitebackup_website_$THEDATE.tar /home/website/public_html
gzip sitebackup_website_$THEDATE.tar

Este script se encuentra en el servidor web, por lo que, para fines de prueba, conecto SSH al servidor, cdal directorio y ejecuto bash backup.sh. mysqldumpno se conecta y parece no poder pasar la contraseña (devuelve un error informando "usando contraseña: NO"). Luego, el comando tar falla e informa que no puede iniciar /home/website/public_htmlcon "no existe tal archivo o directorio". tarluego informa que está saliendo con un estado de error debido a errores anteriores.

¿Que me estoy perdiendo aqui?

Respuesta1

Verifique el script para ver los finales de línea de Windows iniciando sesión en el servidor y ejecutando

cat -v /path/to/script

Si la línea termina en ^M, ese es el problema.

Puedes arreglar un archivo con finales de línea discontinuos ejecutando

dos2unix /path/to/script

Si dos2unix no existe en el servidor, puedes usar sed, así:

sed -i 's/\r$//' /path/to/script

Respuesta2

Ha asignado el nombre de usuario a la variable THEUSER, pero su mysqldumpcomando está usando la variable THEDBUSER.

Respuesta3

tardir=$PWD ; cd /home/website/public_html && 
    tar -czf "$tardir"/sitebackup_complete-office_"$THEDATE.tar"

o solo:

tar -C/home/website/public_html -czf \
    sitebackup_complete-office_"$THEDATE.tar"

En general, muchos tarsno podrán trabajar con rutas absolutas a menos queinstrucciones explícitaspara hacerlo.

De forma predeterminada, GNU tar deja caer un encabezado /en la entrada o salida y se queja de los nombres de archivos que contienen un ..componente. Esta opción desactiva este comportamiento.

Es muy posible que ssh'slos comandos resuelvan las rutas de antemano dependiendo de la entrega del comando y las citas. Lo mismo es relevante para la expansión de las variables en sus nombres de ruta.

Respuesta4

Si entiendo correctamente su descripción del problema, la diferencia clave parece ser laencarceladoSesión SSH: los procesos que se ejecutan dentro de la sesión encarcelada no pueden ver fuera de su directorio de cárcel (a menudo, su hogar). Es por eso que no experimentas problemas en una sesión sin prisión. También podrías echarle un vistazo awikipedia entrada a la cárcelpara más detalles.

información relacionada