Очень странная проблема ...
Самба поделится на пульте:
[javaerpm]
path = /u/abas/erpm/java
force user = erpm
guest ok = yes
read only = no
writeable = yes
Команда монтирования на локальном компьютере с использованием root
root@crunchbang:/mnt/abas# mount -t cifs -o username=guest,rw,exec,auto //10.0.0.2/javaerpm ./javaerpm
Root может читать / писать / cd вообще без проблем:
root@crunchbang:/mnt/abas# cd javaerpm
root@crunchbang:/mnt/abas/javaerpm# touch test
root@crunchbang:/mnt/abas/javaerpm# ll
total 1
-rw-r--r-- 1 501 users 0 Sep 24 09:55 test
root@crunchbang:/mnt/abas/javaerpm# rm test
Но если я переключаюсь на обычного пользователя и делаю то же самое, я получаю это:
shawn@crunchbang:/mnt/abas/javaerpm$ touch test
touch: cannot touch `test': Permission denied
Я могу ll
и я могу видеть, что он написал файл в любом случае:
shawn@crunchbang:/mnt/abas/javaerpm$ ll
total 1
-rw-r--r-- 1 501 users 0 Sep 24 09:55 test
Я даже rm
проблем не могу
shawn@crunchbang:/mnt/abas/javaerpm$ rm test
shawn@crunchbang:/mnt/abas/javaerpm$
Я пробовал разные варианты монтажа. uid=501
ничего не меняет Пробовал, nounix
но тогда это не работает вообще, и я ничего не вижу, используя пользователя root или shawn.
Ответы:
Примечание: я просто догадываюсь, я не гуру самбы.
Samba / CIFS, по крайней мере так, как вы используете его здесь, не воспроизводит учетные данные между сервером и клиентом. Из-за
force user
директивы на сервере все операции выполняютсяerpm
на сервере как пользователь . Однако, поскольку клиент и сервер работают под управлением Unix-системы, они автоматически связывают расширения CIFS POSIX . Это заставляет разрешения Unix работать до определенного момента, но только в той степени, в которой это позволяет сервер, и вы сталкиваетесь с ситуацией, когда требования Unix и разрешения сервера различаются.Вы заметите, что все файлы отображаются как ID пользователя 501. Это их uid на сервере.
Когда вы пытаетесь создать или удалить файл, для этого требуется разрешение на запись в каталог. Весь доступ сопоставляется одному пользователю на сервере, поэтому разрешение на запись сводится к тому
erpm
, разрешена ли запись в этот каталог на сервере. Ответ - да.При запуске
touch
он создает файл, а затем меняет время его изменения. Изменение времени модификации файла требует владения, и это проверяется общим кодом файловой системы на стороне клиента.Если вы запустите
strace touch test
, вы заметите, что тогдаopen
вызов (который создает файл) завершается успешно, тогдаutimes
вызов (или, скорее, в Linuxutimensat
системный вызов) не может установить время.Это на самом деле немного странно, потому что
utimes
должно сработать, так какtouch
вызывает его с аргументом NULL (что означает «установить метку времени на текущее время»), и это должно быть разрешено любому вызывающему, который может записать в файл, и не только владельцу нравится устанавливать произвольную метку времени. Я подозреваю, чтоutimensat
на самом деле выполняется проверка на основе разрешений и определение того, что в разрешениях говорится, что вы не можете записать в этот файл, даже если файловая система разрешит операцию записи независимо от фактических разрешений.Основное преимущество расширений CIFS POSIX, когда сторона сервера работает с разрешениями пользователя без полномочий root, заключается в переносе исполняемого бита и, возможно, владении группой. Это может быть менее запутанным, если вы сопоставите владение пользователем одному клиентскому пользователю с параметром
forceuid
монтирования.источник
username=guest,defaults,noperm
и это полностью решило проблему. Я не знаю, какой ответ принять на этот вопрос, поскольку,username=guest,defaults,noperm
вероятно, это не лучший ответ, и у меня просто нет больше времени, чтобы опробовать ваш ответ. Еще раз спасибо!