Se eu criar um arquivo como um usuário sem privilégios e alterar o modo de permissão para 400
, ele será visto por esse usuário como somente leitura, corretamente:
$ touch somefile
$ chmod 400 somefile
$ [ -w somefile ] && echo rw || echo ro
ro
Tudo está bem.
Mas então o root aparece:
# [ -w somefile ] && echo rw || echo ro
rw
Que diabos? Claro, o root pode gravar em arquivos somente leitura, mas não deve tornar isso um hábito: as melhores práticas tenderiam a ditar que eu deveria ser capaz de testar o bit de permissão de gravação e, se não for, então foi definido assim por uma razão.
Acho que quero entender por que isso está acontecendo e como posso obter um código de retorno falso ao testar um arquivo que não possui o bit de gravação definido?
Eu acho que você entendeu mal o que
-w
faz. Ele não verifica se o arquivo tem "permissões de gravação", ele verifica se o arquivo é gravável pelo usuário que o invocou .Mais especificamente, chama
access(2)
ou similar.por exemplo, se um script tiver
if [ -w /etc/shadow ]
, se você executarstrace
o script, poderá ver uma linha semelhante aComo
root
pode gravar no arquivo, ele retorna 0.por exemplo, como um usuário normal:
como raiz
Isso, apesar de
/etc/shadow
ter permissão000
na minha máquina.Agora o que você quer fazer fica interessante e não é tão simples.
Se você quiser verificar as permissões simples, verifique a
ls
saída, ou chamestat
ou similar. Mas perceba que as ACLs podem substituir essas permissões. Só porque um arquivo tem permissão 400 não o impede de ser gravável...test -w
aka[ -w
não verifica o modo de arquivo. Ele verifica se é gravável. Para raiz, é.A maneira que eu testaria seria fazer uma comparação bit a bit com a saída de
stat(1)
("%a
Direitos de acesso em octal").Observe que o subshell
$(...)
precisa de um0
prefixo para que a saída destat
seja interpretada como octal por(( ... ))
.O usuário root pode fazer o que quiser, as permissões de arquivo "normais" não são uma limitação. Ele não executará diretamente um arquivo simples sem nenhuma permissão de eXecute, apenas para um pouco de segurança contra a prática de tiro ao alvo.