Привет всем.
У меня такая проблема: не работает shell-скрипт.
Скрипт должен делать простую вещь - восстанавливать из архива сайт на drupal с файлами и базой данных. Сначала должен удалять папку с файлами сайта, потом извлекать на их место такую же папку из архива, потом запускает mysql для восстановления базы, потом меняет права доступа на извлечённые из архива файлы. Все команды, которые есть в скрипте, проверены. Если их вводить в терминале вручную - они выполняются нормально. Но вот если запускаю скрипт, в котором по очереди идут те же самые команды - получаю кучу ошибок о том, что указанных файлов и каталогов не существует. На команду "cd /var/www" пишет: ": Нет такого файла или каталогаd: /var/www" (почему-то именно так, с буковкой "d" после "каталога"). Но каталог есть! И если просто набрать в терминале то же самое - каталог меняется на этот самый несуществующий /var/www.
Скрипт выполняется из-под рута, так что проблемы с правами доступа маловероятны.
Несмотря на то, что файл сохранён в кодировке utf8 и локаль в системе указана тоже utf8, я предполагал, что проблемы с кодировкой файла. Но вывод cat показывает нормальное содержимое файла. Попробовал поменять кодировку с utf8 без BOM на utf8 с BOM - никакого эффекта.
Кто знаком с консолью - подскажите пожалуйста, в чём тут может быть дело.
Вывод uname -a:
Linux FiredestU 2.6.32-22-generic #33-Ubuntu SMP Wed Apr 28 13:27:30 UTC 2010 i686 GNU/Linux
[Решено] Вопрос новичка: не работают shell-скрипты
сам скрипт показать не желаете? связь с астралом нынче дорога, да еще и роуминг все дела..
Конечно.
#!/bin/bash
# Deleting sql file if exists:
rm -f "/var/www/wxnewbase.sql"
# Deleting wx site folder:
rm -r -f "/var/www/wxNew"
# Switching to site folder:
cd "/var/www"
# Extracting last backup from archive into site folder:
7z x "/home/cansee/Projects/Apache/SiteBackups/wxnewsite.7z"
# Restoring database:
mysql -h localhost -u root --password="Password" wxbooksite < "/var/www/wxnewbase.sql"
# Deleting sql file:
rm -f "/var/www/wxnewbase.sql"
# Setting read and execution rights for CPP site folder:
chmod -R 755 "/var/www/wxNew"
# Setting write rights for "sites/default/files" folder:
chmod -R 777 "/var/www/wxNew/sites/default/files"
проверьте, так и есть что кавычка пропущена или вы сейчас ошиблись?
rm -f "/var/www/wxnewbase.sql
А попробуй все пути без кавычек прописать.
проверьте, так и есть что кавычка пропущена или вы сейчас ошиблись?
Я в сообщении на форуме ошибся. Сейчас поправил. В самом скрипте всё вроде нормально было. Сейчас ещё раз проверил. Скрипт я в gedit набирал, он подсвечивает синтаксис и выделяет розовым всё, что за незакрытой кавычкой. Так что ошибку сразу видно.
А попробуй все пути без кавычек прописать.
У меня скрипт сначала был вообще без кавычек. Но потом, когда он отказался работать, я взял все пути в кавычки - думал, может дело в этом. Не помогло. Вручную команды в терминале пишу, скопировав с этого же скрипта - работает и с кавычками, и без. Запускаю скрипт - "sudo bash ./RestoreWxSite.sh" - получаю кучу ошибок независимо от наличия кавычек.
вся проблема в настройках sudo я так понимаю.
вся проблема в настройках sudo я так понимаю.
А не будете ли так добры объяснить, что за настройки, как до них добраться, и что там предположительно надо поменять, чтобы скрипты заработали? :)
Я пробовал и чуть-чуть по-другому сделать - из одного терминала запускал второй терминал (впрочем, опять же через sudo), а уже в нём просто набирал команды. Результат был тот же.
cat /etc/sudoersпокажите
cansee@FiredestU:~$ sudo cat /etc/sudoers
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL) ALL
# Allow members of group sudo to execute any command after they have
# provided their password
# (Note that later entries override this, so you might need to move
# it further down)
%sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
cansee@FiredestU:~$
Попробовал погуглить на тему "настройки sudo", почитать вывод "man sudo". Узнал много нового, но идей по поводу придания скрипту работоспособности не появилось :(
попробуй в скрипте только одну команду что он скажет, например
#!/bin/bash
# Deleting sql file if exists:
rm -f "/var/www/wxnewbase.sql"
Если не будет ошыбки то добавляй новую, если будет то попробуй без sudo а прямо из под рута.
Одну команду удаления sql-файла в начале скрипта оставлять большого смысла нет, потому что в большинстве случаев этот файл до запуска скрипта отсутствует. И команда при этом ошибки не возвращает. Есть файл, нет файла - всё равно отрабатывает успешно. И следующая тоже, которая должна директорию удалять. А вот уже cd "/var/www" пишет, что нету такого каталога "/var/www".
Попробую оставить только cd "/var/www" - может появится какая-то новая информация.
Ещё дополнение - есть похожий скрипт, но не для восстановления, а для бэкапа сайта. Скрипт бэкапа файлы из /var/www только читает, архив с бэкапом пишется в пользовательскую директорию, поэтому права рута ему не нужны и запускается он без sudo. И отрабатывает нормально. Так что проблема похоже действительно в sudo. Но вот что там надо поменять, чтобы заработало...
Одну команду удаления sql-файла в начале скрипта оставлять большого смысла нет, потому что в большинстве случаев этот файл до запуска скрипта отсутствует. И команда при этом ошибки не возвращает. Есть файл, нет файла - всё равно отрабатывает успешно. И следующая тоже, которая должна директорию удалять. А вот уже cd "/var/www" пишет, что нету такого каталога "/var/www".
Попробую оставить только cd "/var/www" - может появится какая-то новая информация.
Ещё дополнение - есть похожий скрипт, но не для восстановления, а для бэкапа сайта. Скрипт бэкапа файлы из /var/www только читает, архив с бэкапом пишется в пользовательскую директорию, поэтому права рута ему не нужны и запускается он без sudo. И отрабатывает нормально. Так что проблема похоже действительно в sudo. Но вот что там надо поменять, чтобы заработало...
Приведите этот скрипт как вложение, лучше в заархивированном виде (gzip <name>).
Пётр.
Прилагаю скрипт, запакованный в архив "gz".
Прилагаю скрипт, запакованный в архив "gz".
Я, наверное, тупой, но я его не вижу.
Пётр.
Ага, чего-то я накосячил. Почему-то файл не приложился с первого раза.
Отредактировал сообщение, приложил к нему файл. Сейчас он точно есть :)
Ага, чего-то я накосячил. Почему-то файл не приложился с первого раза.
Отредактировал сообщение, приложил к нему файл. Сейчас он точно есть :)
Да, я скачал. Попробуйте для эксперимента приложенный вариант,
но я ничего не обещаю.
Пётр.
Байты 0D в конце каждой строки удалены?
Да, наверное в этом было дело. У меня chmod выдавал ошибки наподобие: невозможно получить доступ к "/var/www/wxNew\r".
Так что наверное проблема действительно с окончаниями строк.
Приду домой - обязательно попробую (сейчас я на работе, здесь у меня только windows).
Спасибо большое :)
Да, я удалил <CR>.
Пётр.
Проверил. Да, действительно в этом было дело. Скрипт с нормальными линуксовыми концами строк работает нормально :)
Спасибо :)