Por que esse script de shell falha no bash, mas os comandos funcionam no SSH?

Por que esse script de shell falha no bash, mas os comandos funcionam no SSH?

O que estou tentando escrever é um script de shell que fará backup de um site e de todos os bancos de dados MySQL que o suportam. Encontrei exemplos em toda a rede, mas quando executo o script no bash em uma sessão SSH presa, ele falha. Se eu digitar os comandos diretamente na sessão SSH, eles funcionarão bem.

#!/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 reside no servidor web, portanto, para fins de teste, eu faço SSH no servidor, cdno diretório e executo o bash backup.sh. mysqldumpnão está se conectando, parecendo não conseguir passar a senha (ele retorna um erro relatando 'usando senha: NÃO'). Em seguida, o comando tar falha, relatando que não pode ser iniciado /home/website/public_htmlcom um 'arquivo ou diretório inexistente'. tarem seguida, relata que está saindo com status de erro devido a erros anteriores.

O que estou perdendo aqui?

Responder1

Verifique o script para terminações de linha do Windows fazendo login no servidor e executando

cat -v /path/to/script

Se a linha terminar com ^M, esse é o problema.

Você pode corrigir um arquivo com finais de linha quebrados executando

dos2unix /path/to/script

Se dos2unix não existir no servidor, você poderá usar sed, assim:

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

Responder2

Você atribuiu o nome de usuário à variável THEUSER, mas seu mysqldumpcomando está usando a variável THEDBUSER.

Responder3

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

ou apenas:

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

Em geral, muitos tarsnão conseguirão trabalhar com caminhos absolutos, a menos queexplicitamente instruídopara fazer isso.

Por padrão, o GNU tar descarta /a entrada ou saída e reclama dos nomes dos arquivos que contêm um ..componente. Esta opção desativa esse comportamento.

É perfeitamente possível que ssh'sos comandos resolvam caminhos antecipadamente, dependendo da entrega e cotação do comando. O mesmo é relevante para a expansão das variáveis ​​nos seus nomes de caminho.

Responder4

Se entendi corretamente a descrição do problema, a principal diferença parece ser apresoSessão SSH - os processos em execução dentro da sessão encarcerada não podem ser vistos fora de seu diretório de prisão (geralmente sua casa). É por isso que você não tem problemas em sessões sem prisão. Você também pode dar uma olhada nowikipedia Entrada na prisãopara mais detalhes.

informação relacionada