У меня какой-то замкнутый круг, не могу нагуглить ответ уже второй день.
Дано:- Есть сетевой NAS на основе какого-то линукса, который раздаёт папку как расшаренную папку windows - доступ для всех на запись
- Эта сетевая папка отлично видна и работает на запись для windows desktop клиентов
- Настраиваю Ubuntu Server 14.04 на котором будет работать web-приложение под nginx+php-fpm - самые обычные настройки, запускаются под пользователем www-data
Задача:
PHP веб-приложение иногда должно создавать вложенные папки и файлы внутри той самой расшаренной папки на NAS. Например, писать файлы с помощью file_put_contents.
С другой стороны, я хочу сидя на ubuntu сервере по ssh под своим пользователем также иметь доступ на запись в эту расшаренную папку (буду иногда вручную запускать всякие скприты, которые будут туда писать).
Пробую решитьПопытка номер 1:
Пишу в /etc/fstab следующую строку:
//192.168.20.115/filesfolders$ /mnt/filesfolder cifs user=guest,pass=,iocharset=utf8,dir_mode=0777,file_mode=0777,sec=lanman 0 0
Обратите внимание на опции
dir_mode=0777,file_mode=0777 - про них каждый второй ответ на stackoverflow, что стоит их добавить и всё заработает само! (ха-ха)
Монтирую $ sudo mount -a
Проверим как смонтировалось:
$ cat /etc/mtab
//192.168.20.115/filesfolders$ /mnt/filesfolder cifs rw 0 0
Посмотрим какие права получились у папки:
$ ls -ld /mnt/filesfolder/
drwxrwxrwx+ 28 nobody nogroup 0 февр. 18 11:40 /mnt/filesfolder/
Вроде есть доступ на запись для всех: drwxrwxrwx. Попробуем записать новый файл:
$ echo "hello" > /mnt/filesfolder/1.txt
-bash: /mnt/filesfolder/1.txt: Permission denied
Но почему?
Что инетерсно, сам файл создался, но он пуст:
$ ls -l /mnt/filesfolder/1.txt
-rwxr--r--+ 1 nobody nogroup 0 февр. 18 11:40 /mnt/filesfolder/1.txt
Проверим, могу ли я писать файлы из веб-приложения? Пишем php скрипт, который будет запускаться при заходе на страницу
<?php
file_put_contents('/mnt/filesfolder/test_from_php.txt', 'Hello from PHP');
Открываем в браузере
192.168.20.149/test.php (это мой ubuntu сервер с запущенным nginx+php-fpm, где мы совбственно пытаемся монтировать) и получаем:
Warning: file_put_contents(/mnt/filesfolder/test_from_php.txt): failed to open stream: Permission denied in /usr/share/nginx/html/test.php on line 2
Т.е. из скрипта тоже никакого доступа на запись нет :(
Если посмотреть в консоли, то обнаружим, что файл создался, только он пустой - этого я никак не понимаю
$ ls -l /mnt/filesfolder/test_from_php.txt
-rwxr--r--+ 1 nobody nogroup 0 февр. 18 11:56 /mnt/filesfolder/test_from_php.txt
Попытка номер 2:
Погуглил, узнал, что нужно при монтировании cifs шары указывать uid и gid.
Попробуем. Для начала узнаем мои uid и gid.
$ whoami
ad
$ id ad
uid=1000(ad) gid=1000(ad) groups=1000(ad),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),112(lpadmin),113(sambashare)
Узнали: я пользователь ad и моя основная группа ad
Сначала отмонтируем: $ sudo umount -l /mnt/filesfolder
Потом меняем fstab: $ sudo nano /etc/fstab
//192.168.20.115/filesfolders$ /mnt/filesfolder cifs user=guest,pass=,iocharset=utf8,uid=ad,gid=ad,dir_mode=0777,file_mode=0777,sec=lanman 0 0
Монтируем заново: $ sudo mount -a
Смотрим на папку:
$ ls -ld /mnt/filesfolder/
drwxrwxrwx+ 28 ad ad 0 февр. 18 11:56 /mnt/filesfolder/
Теперь owner стал ad/ad (раньше был nobody/nogroup)
Запись нового файла в папку заработала:
$ echo "hello" > /mnt/filesfolder/2.txt
$ ls -l /mnt/filesfolder/2.txt
-rwxr--r--+ 1 ad ad 6 февр. 18 12:05 /mnt/filesfolder/2.txt
Попробуем наш php скрипт через браузер (предварительно удаляю старый пустой test.txt с помощью windows машины):
Открываем браузер
192.168.20.149/test.php и видим старое знакомое сообщение:
Warning: file_put_contents(/mnt/filesfolder/test_from_php.txt): failed to open stream: Permission denied in /usr/share/nginx/html/test.php on line 2
При этом файл test_from_php.txt создаётся:
$ ls -l /mnt/filesfolder/test_from_php.txt
-rwxr--r--+ 1 ad ad 0 февр. 18 12:07 /mnt/filesfolder/test_from_php.txt
и теперь у него owner почему-то ad/ad
Кстати, надо бы проверить, что мой nginx+php-fpm работают как www-data, для этого пишу такой простой php скприт и открываю его в браузере:
<?php
print exec('whoami')
Выводит текст в браузере: www-data
Получается я из консоли теперь могу писать в эту расшаренную папку, но моё веб-приложение всё ещё не может.
Попытка номер 3:
Размонтируем, меняем fstab, указывая uid=www-data,gid=www-data, монтируем обрабтно, проверяем:
$ ls -ld /mnt/filesfolder/
drwxrwxrwx+ 28 www-data www-data 0 февр. 18 12:07 /mnt/filesfolder/
Пробуем записать файл через консоль - опять отказ (как и в попытке номер 1, но я не понимаю почему, ведь права на папку drwxrwxrwx)
$ echo "hello" > /mnt/filesfolder/3.txt
-bash: /mnt/filesfolder/3.txt: Permission denied
$ ls -l /mnt/filesfolder/3.txt
-rwxr--r--+ 1 www-data www-data 0 февр. 18 12:15 /mnt/filesfolder/3.txt
Зато php-скрипт через браузер не выдёт никаких ошибок и файл test_from_php.txt записывается успешно!
$ ls -l /mnt/filesfolder/test_from_php.txt
-rwxr--r--+ 1 www-data www-data 14 февр. 18 12:16 /mnt/filesfolder/test_from_php.txt
$ cat /mnt/filesfolder/test_from_php.txt
Hello from PHP
Внимание, вопрос:
Как мне примонтировать папку так, чтобы я и из консоли мог в неё записывать и из web-приложения, которое под пользователем www-data?
И почему в экспериментах выше у меня вообще проблемы с записью в папку, если она выглядит как drwxrwxrwx - т.е. доступна на запись для всех пользователей всех групп?