Я пытаюсь написать скрипт оболочки, который будет делать резервную копию веб-сайта и всех баз данных 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 сессии. Вы также можете взглянуть наВикипедия Тюремная записьБольше подробностей.