Problema muito estranho ...
Compartilhamento do Samba no controle remoto:
[javaerpm]
path = /u/abas/erpm/java
force user = erpm
guest ok = yes
read only = no
writeable = yes
Comando Mount no local usando root:
root@crunchbang:/mnt/abas# mount -t cifs -o username=guest,rw,exec,auto //10.0.0.2/javaerpm ./javaerpm
O root pode ler / gravar / cd sem nenhum problema:
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
Mas se eu mudar para um usuário comum e fizer a mesma coisa, recebo o seguinte:
shawn@crunchbang:/mnt/abas/javaerpm$ touch test
touch: cannot touch `test': Permission denied
Eu posso ll
e posso ver que ele escreveu o arquivo de qualquer maneira:
shawn@crunchbang:/mnt/abas/javaerpm$ ll
total 1
-rw-r--r-- 1 501 users 0 Sep 24 09:55 test
Eu não posso mesmo rm
problema:
shawn@crunchbang:/mnt/abas/javaerpm$ rm test
shawn@crunchbang:/mnt/abas/javaerpm$
Eu tentei diferentes opções de montagem. uid=501
não muda nada. Tentei, nounix
mas depois não funciona e não vejo nada usando o usuário root ou shawn.
Respostas:
Nota: Eu estou supondo que aqui, eu não sou um guru do samba.
O Samba / CIFS, pelo menos da maneira que você está usando aqui, não reproduz credenciais entre o servidor e o cliente. Por causa da
force user
diretiva no servidor, todas as operações são executadas como o usuárioerpm
no servidor. No entanto, como o cliente e o servidor estão executando um sistema unix, eles negociaram automaticamente as extensões CIFS POSIX . Isso faz com que as permissões unix pareçam funcionar até certo ponto, mas apenas na medida em que o servidor permitir, e você terá um caso em que o que as permissões unix reivindicam e o que o servidor permite diferir.Você notará que todos os arquivos aparecem como ID do usuário 501. Esse é o seu uid no servidor.
Quando você tenta criar ou remover um arquivo, isso requer permissão de gravação no diretório. Todo o acesso é mapeado para um único usuário no servidor, portanto, a permissão de gravação se resume a se
erpm
é permitido gravar nesse diretório no servidor. A resposta é sim.Quando você executa
touch
, ele cria o arquivo e altera seu tempo de modificação. Alterar a hora da modificação de um arquivo requer propriedade, e isso é testado pelo código genérico do sistema de arquivos, no lado do cliente.Se você executar
strace touch test
, notará que aopen
chamada (que cria o arquivo) é bem-sucedida e, em seguida, autimes
chamada (ou melhor, no Linux, autimensat
chamada do sistema) falha ao definir os horários.Na verdade, isso é um pouco estranho, porque
utimes
deve ser bem - sucedido, já que otouch
chama com um argumento NULL (que significa "definir o carimbo de data / hora para o horário atual"), e isso deve ser permitido a qualquer chamador que possa gravar no arquivo, e não apenas para o proprietário, como definir um carimbo de data e hora arbitrário. Suspeito queutimensat
esteja realmente fazendo uma verificação baseada em permissões e determinando que as permissões digam que você não pode gravar nesse arquivo, mesmo que o sistema de arquivos permita uma operação de gravação independentemente das permissões reais.A principal vantagem das extensões CIFS POSIX, quando o lado do servidor está sendo executado com as permissões de um usuário não raiz, é transportar o bit executável e, possivelmente, a propriedade do grupo. Pode ser menos confuso se você mapear a propriedade do usuário para um único usuário do lado do cliente com a
forceuid
opção de montagem.fonte
username=guest,defaults,noperm
e isso resolveu totalmente o problema. Não sei qual resposta aceitar nesta, poisusername=guest,defaults,noperm
provavelmente não é a melhor resposta e simplesmente não tenho mais tempo para tentar sua resposta. Mais uma vez obrigado!