Почему этот скрипт оболочки не работает в bash, но команды работают в SSH?

Почему этот скрипт оболочки не работает в bash, но команды работают в SSH?

Я пытаюсь написать скрипт оболочки, который будет делать резервную копию веб-сайта и всех баз данных MySQL, которые его поддерживают. Я нашел примеры по всему интернету, но когда я запускаю скрипт в bash в закрытой сессии SSH, он падает. Если я ввожу команды прямо в сессию SSH, они работают нормально.

#!/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

Этот скрипт находится на веб-сервере, поэтому для целей тестирования я подключаюсь по SSH к серверу, cdв каталог и запускаю bash backup.sh. mysqldumpне подключается, похоже, не может передать пароль (возвращает ошибку «использование пароля: НЕТ»). Затем команда tar дает сбой, сообщая, что не может выполнить stat /home/website/public_htmlс «нет такого файла или каталога». tarзатем сообщает, что завершается со статусом ошибки из-за предыдущих ошибок.

Что я здесь упускаю?

решение1

Проверьте скрипт на наличие окончаний строк Windows, войдя на сервер и запустив

cat -v /path/to/script

Если строка заканчивается на ^M, то это проблема.

Вы можете исправить файл с разорванными окончаниями строк, запустив

dos2unix /path/to/script

Если dos2unix отсутствует на сервере, вы можете использовать sed, например так:

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

решение2

Вы присвоили имя пользователя переменной THEUSER, но ваша mysqldumpкоманда использует переменную THEDBUSER.

решение3

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

или просто:

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

В общем случае многие tarsвообще не будут работать с абсолютными путями, если толькочетко проинструктированосделать это.

По умолчанию GNU tar удаляет лидирующие данные /на входе или выходе и жалуется на имена файлов, содержащие ..компонент. Эта опция отключает такое поведение.

Вполне возможно, что ssh'sкоманды разрешают пути заранее в зависимости от доставки команды и кавычек. То же самое относится к расширению переменных в ваших именах путей.

решение4

Если я правильно понял ваше описание проблемы, то ключевое отличие, похоже, заключается взаключен в тюрьмуSSH сессия - процессы, запущенные внутри сессии jailed, не могут видеть за пределами своего каталога jail (часто их домашнего). Вот почему у вас не возникает проблем в не-jailed сессии. Вы также можете взглянуть наВикипедия Тюремная записьБольше подробностей.

Связанный контент