development

Python 모듈 os.chmod (file, 664)는 권한을 rw-rw-r로 변경하지 않지만 -w--wx ----

big-blog 2020. 8. 24. 21:06
반응형

Python 모듈 os.chmod (file, 664)는 권한을 rw-rw-r로 변경하지 않지만 -w--wx ----


최근에 Python 모듈 os를 사용하고 있는데 파일의 권한을 변경하려고 할 때 예상 한 결과를 얻지 못했습니다. 예를 들어 권한을 rw-rw-r--로 변경하려고했습니다.

os.chmod("/tmp/test_file", 664)

소유권 권한은 실제로 -w--wx --- (230)입니다.

--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file

그러나 코드에서 664를 0664로 변경하면 결과는 내가 필요한 것입니다.

os.chmod("/tmp/test_file", 0664)

결과는 다음과 같습니다.

-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file

아무도 올바른 결과를 얻기 위해 선행 0이 왜 그렇게 중요한지 설명하는 데 도움을 줄 수 있습니까?


다른 포럼 에서 찾았습니다.

선행 0이 왜 중요한지 궁금하다면 권한이 8 진수 정수로 설정되어 있고 Python은 선행 0이있는 모든 정수를 8 진수로 자동 처리하기 때문입니다. 따라서 os.chmod ( "file", 484) (십진수)는 동일한 결과를 제공합니다.

당신이하고 664있는 것은 8 진수로 통과 하는 것입니다.1230

귀하의 경우에는

os.chmod("/tmp/test_file", 436)

[업데이트] 참고, Python 3의 경우 접두사 0o (zero oh)가 있습니다. EG,0o666


따라서 다음과 유사한 의미를 원하는 사람들을 위해 :

$ chmod 755 somefile

사용하다:

$ python -c "import os; os.chmod('somefile', 0o755)"

Python이 2.6보다 오래된 경우 :

$ python -c "import os; os.chmod('somefile', 0755)"

선행 "0"은 이것이 10 진수가 아니라 8 진수 상수임을 의미합니다. 파일 모드를 변경하려면 8 진수가 필요합니다.

권한은 비트 마스크입니다. 예를 들어, rwxrwx ---는 이진수로 111111000이고 십진수 표현을 계산하는 것보다 비트를 3으로 그룹화하여 8 진수로 변환하는 것이 매우 쉽습니다.

0644 (8 진수)는 이진수로 0.110.100.100 (가독성을 위해 점을 추가했습니다) 또는 계산할 수 있듯이 10 진수로 420입니다.


숫자 대신 권한 기호 사용

원시 매직 넘버가 아닌 의미 론적으로 명명 된 권한 기호를 사용했다면 문제가 발생하지 않았을 것입니다 664.

#!/usr/bin/env python3

import os
import stat

os.chmod(
    'myfile',
    stat.S_IRUSR |
    stat.S_IWUSR |
    stat.S_IRGRP |
    stat.S_IWGRP |
    stat.S_IROTH
)

이것은 https://docs.python.org/3/library/os.html#os.chmod에 문서화되어 있으며 이름은에 문서화 된 POSIX C API과 동일합니다 man 2 stat.

또 다른 장점은 문서에 언급 된대로 더 큰 이식성입니다.

참고 : Windows는을 지원하지만 chmod()파일의 읽기 전용 플래그를 ( stat.S_IWRITEstat.S_IREAD상수 또는 해당 정수 값을 통해) 설정할 수만 있습니다 . 다른 모든 비트는 무시됩니다.

chmod +x다음에서 시연됩니다. 파이썬 내에서 간단한 "chmod + x"를 어떻게 수행합니까?

Ubuntu 16.04, Python 3.5.2에서 테스트되었습니다.

참고URL : https://stackoverflow.com/questions/15607903/python-module-os-chmodfile-664-does-not-change-the-permission-to-rw-rw-r-bu

반응형