Baru-baru ini saya menggunakan modul os Python, ketika saya mencoba mengubah izin file, saya tidak mendapatkan hasil yang diharapkan. Misalnya, saya bermaksud mengubah izin menjadi rw-rw-r--,
os.chmod("/tmp/test_file", 664)
Izin kepemilikan sebenarnya -w - wx --- (230)
--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file
Namun, jika saya mengubah kode 664 menjadi 0664, hasilnya hanya yang saya butuhkan, mis
os.chmod("/tmp/test_file", 0664)
Hasilnya adalah:
-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file
Adakah yang bisa membantu menjelaskan mengapa awalan 0 itu begitu penting untuk mendapatkan hasil yang benar?
python
file
permissions
chmod
AplusG
sumber
sumber
Jawaban:
Temukan ini di forum lain
Apa yang Anda lakukan adalah lewat
664
yang dalam oktal1230
Dalam kasus Anda, Anda akan membutuhkannya
[Pembaruan] Catatan, untuk Python 3 Anda memiliki awalan dengan 0o (nol oh). MISALNYA,
0o666
sumber
1
ini tidak dibuang! Itu adalah bit sticky / setuid / setgid, dan 1 artinyasticky
. Menggunakanls -l
Anda mungkin melihat izin sekarang termasukT
pada akhirnya ...Jadi bagi orang yang menginginkan semantik mirip dengan:
Menggunakan:
Jika Python Anda lebih tua dari 2.6:
sumber
00755
, hanya untuk memperjelas ke mana suid / sgid / sticky bits pergi, jika beberapa pengembang kemudian datang dan ingin menggunakan skrip lama ini, misalnya, sgid dengan2755
tetapi kemudian tidak tahu mengapa perms benar-benar kacau. ;)leading
0
artinya ini adalah konstanta oktal , bukan desimal. dan Anda memerlukan oktal untuk mengubah mode file.hak akses yang sedikit masker, misalnya,
rwxrwx---
adalah111111000
dalam biner, dan itu sangat mudah untuk kelompok bit dengan 3 untuk mengkonversi ke oktal, daripada menghitung representasi desimal.0644
(oktal)0.110.100.100
dalam biner (saya telah menambahkan titik agar terbaca), atau, seperti yang dapat Anda hitung,420
dalam desimal.sumber
Gunakan simbol izin alih-alih angka
Masalah Anda akan terhindarkan jika Anda menggunakan simbol izin yang diberi nama secara lebih semantik daripada angka ajaib mentah, misalnya untuk
664
:Ini didokumentasikan di https://docs.python.org/3/library/os.html#os.chmod dan namanya sama dengan nilai API C POSIX yang didokumentasikan di
man 2 stat
.Keuntungan lainnya adalah portabilitas yang lebih besar seperti yang disebutkan dalam dokumen:
chmod +x
ditunjukkan di: Bagaimana Anda melakukan "chmod + x" sederhana dari dalam python?Diuji di Ubuntu 16.04, Python 3.5.2.
sumber
Jika Anda memiliki izin yang diinginkan disimpan ke string, lakukan
sumber
Menggunakan stat. * Bit mask menurut saya merupakan cara paling portabel dan eksplisit untuk melakukan ini. Namun di sisi lain, saya sering lupa cara terbaik untuk mengatasinya. Jadi, berikut adalah contoh untuk menutupi izin 'grup' dan 'lainnya' dan membiarkan izin 'pemilik' tidak tersentuh. Menggunakan bitmask dan pengurangan adalah pola yang berguna.
sumber