Как правильно смонтировать cifs (ubuntu 14.04) с доступом на запись для nginx/php (www-data)?

У меня какой-то замкнутый круг, не могу нагуглить ответ уже второй день.

Дано:
  • Есть сетевой 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 - т.е. доступна на запись для всех пользователей всех групп?
  • Вопрос задан
  • 21070 просмотров
Пригласить эксперта
Ответы на вопрос 2
PQR
@PQR Автор вопроса
Прочитал вот этот мануал linux.die.net/man/8/mount.cifs и добавил в параметры монтирования в /etc/fstab параметр noperm - внезапно доступ на запись появился у обоих пользователей (у моего консольного и веб-сервера www-data).

Итого, строка подключения в fstab выглядит так: //192.168.20.115/filesfolders$ /mnt/filesfolder cifs user=guest,pass=,iocharset=utf8,noperm,uid=www-data,gid=www-data,dir_mode=0777,file_mode=0777,sec=lanman 0 0

Однако, это не снимает общих вопросов на понимание: почему у директории я вижу права drwxrwxrwx, а на деле писать в неё может только owner? Почему файлы при сообщениях permission denied файлы всё-таки создаются, но пустые (если нет доступа, то его не должно быть совсем, так ведь?)
Ответ написан
@mihmig
У меня заработало с такими параметрами:
//192.168.0.1/share /mounted cifs users,user=user,password=password,rw,iocharset=utf8,gid=user,uid=user,noatime,nounix,file_mode=0777,dir_mode=0777,auto 0 0
Возможно, у Вас был какой-то релиз модуля cifs c багом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы