
У меня есть скрипт, который копирует резервные копии SQL на сервер Windows. Вот строка из /etc/fstab:
//my.win.box/share$ /winshare cifs credentials=/etc/credfile,dom=mydomain,uid=0,gid=0,file_mode=0600,dir_mode=0700 0 0
Вот скрипт резервного копирования:
резервное копирование.sh:
# copy zipped sql exports to /winshare/db
find /backups/sql/*sql.gz -mtime +1 -exec cp {} /winshare/db \;
Выполнен вход с правами root (в данном случае как root)
$ ./backup.sh
cp: cannot create regular file `/winshare/db/mydb_20130301.sql.gz': Permission denied
Однако если я введу команду из командной строки, а не через скрипт:
$ find /backups/sql/*sql.gz -mtime +1 -exec cp {} /winshare/db \;
Файл(ы) скопированы, как и ожидалось. Опять же, зашел как root здесь.
Что может быть причиной сбоя команды в скрипте, но при этом та же команда работает из консоли?
решение1
Вы не говорите, что это за машина, но мое первое наблюдение: у вас нет строки интерпретатора в вашем backup.sh, чтобы указать, какая программа должна ее запускать. Вы хотите что-то вроде этого:
#!/bin/bash
export PATH=/bin:/usr/bin
find....your stuff..here
Теперь, это само по себе не решит ваш вопрос о разрешениях, но это поможет. Может быть системный .rc-файл, который ваша оболочка использовала, который указал другую команду find или кто знает, что он сделал. Указав интерпретатор, вы можете затем посмотреть файлы инициализации этого интерпретатора. Кроме того, ваша среда входа может иметь среду, которой нет у скрипта.