Recentemente estou usando o sistema operacional do módulo Python, quando tentei alterar a permissão de um arquivo, não obtive o resultado esperado. Por exemplo, eu pretendia alterar a permissão para rw-rw-r--,
os.chmod("/tmp/test_file", 664)
A permissão de propriedade é, na verdade, -w - wx --- (230)
--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file
No entanto, se eu alterar 664 para 0664 no código, o resultado é exatamente o que eu preciso, por exemplo
os.chmod("/tmp/test_file", 0664)
O resultado é:
-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file
Alguém poderia ajudar a explicar por que esse 0 inicial é tão importante para obter o resultado correto?
python
file
permissions
chmod
AplusG
fonte
fonte
Respostas:
Encontrei isso em um fórum diferente
O que você está fazendo é passar
664
que em octal é1230
No seu caso, você precisaria
[Atualizar] Nota, para Python 3 você tem prefixo com 0o (zero oh). POR EXEMPLO,
0o666
fonte
1
é descartado! Esse é o bit sticky / setuid / setgid e 1 significa . Usando você pode notar que as permissões agora incluem um no final ...sticky
ls -l
T
Então, para pessoas que desejam uma semântica semelhante a:
Usar:
Se seu Python for anterior a 2.6:
fonte
00755
, apenas para deixar claro para onde vão os bits suid / sgid / sticky, no caso de algum desenvolvedor posterior aparecer e quiser fazer esse script antigo usar, por exemplo, sgid com,2755
mas não consegue descobrir por quê as permanentes estão completamente danificadas. ;)à esquerda
0
significa que esta é uma constante octal , não decimal. e você precisa de um octal para alterar o modo de arquivo.as permissões são uma máscara de bits, por exemplo,
rwxrwx---
está111111000
em binário, e é muito fácil agrupar os bits por 3 para converter para o octal, do que calcular a representação decimal.0644
(octal) está0.110.100.100
em binário (adicionei pontos para facilitar a leitura) ou, como você pode calcular,420
em decimal.fonte
Use símbolos de permissão em vez de números
Seu problema teria sido evitado se você tivesse usado os símbolos de permissão com nomes mais semanticamente em vez de números mágicos brutos, por exemplo, para
664
:Isso está documentado em https://docs.python.org/3/library/os.html#os.chmod e os nomes são iguais aos valores da API POSIX C documentados em
man 2 stat
.Outra vantagem é a maior portabilidade conforme mencionado na documentação:
chmod +x
é demonstrado em: Como você faz um simples "chmod + x" de dentro do python?Testado no Ubuntu 16.04, Python 3.5.2.
fonte
Se você deseja as permissões salvas na string, faça
fonte
Usar as máscaras de bits stat. * Parece-me a maneira mais portátil e explícita de fazer isso. Mas, por outro lado, muitas vezes me esqueço da melhor forma de lidar com isso. Então, aqui está um exemplo de mascarar as permissões de 'grupo' e 'outras' e deixar as permissões de 'proprietário' intocadas. Usar bitmasks e subtração é um padrão útil.
fonte