Apa cara terbaik dengan Python untuk menentukan apakah direktori dapat ditulisi untuk pengguna yang menjalankan skrip? Karena ini kemungkinan akan melibatkan penggunaan modul os, saya harus menyebutkan bahwa saya menjalankannya di bawah lingkungan * nix.
python
file
permissions
directory
operating-system
illuminatedtiger
sumber
sumber
os.access()
itu cek menggunakan nyata UID dan GID, bukan efektif yang. Hal ini dapat menyebabkan keanehan di lingkungan SUID / SGID. ('tetapi skrip menjalankan setuid root, mengapa tidak bisa menulis ke file?')os.access(dirpath, os.W_OK | os.X_OK)
mengembalikan True meskipun saya tidak memiliki akses tulis.Mungkin tampak aneh untuk menyarankan ini, tetapi idiom Python yang umum adalah
Mengikuti idiom itu, orang mungkin berkata:
Coba tulis ke direktori yang dimaksud, dan tangkap kesalahannya jika Anda tidak memiliki izin untuk melakukannya.
sumber
except: pass
- dengan cara ini Anda selalu bisa optimis dan memikirkan diri sendiri. / sarkasme off. Sekarang mengapa saya ingin, misalnya mencoba menulis sesuatu ke setiap direktori di sistem file saya, untuk membuat daftar lokasi yang dapat ditulis?Solusi saya menggunakan
tempfile
modul:Pembaruan: Setelah menguji kode lagi pada Windows saya melihat bahwa memang ada masalah saat menggunakan tempfile di sana, lihat issue22107: kesalahan tafsir modul tempfile akses ditolak pada Windows . Dalam kasus direktori yang tidak dapat ditulis, kode macet selama beberapa detik dan akhirnya melempar
IOError: [Errno 17] No usable temporary file name found
. Mungkin ini yang diamati oleh user2171842? Sayangnya masalah tersebut belum teratasi untuk saat ini, jadi untuk menanganinya, kesalahan juga perlu diperhatikan:Penundaan tentu saja masih ada dalam kasus-kasus ini.
sumber
tempfile
. ini hanya berfungsi jika tidak adaOSError
artinya ia memiliki izin untuk menulis / menghapus. selain itu tidak akan terjadireturn False
karena tidak ada kesalahan yang dikembalikan, dan skrip tidak akan terus dijalankan atau keluar. tidak ada yang dikembalikan. itu hanya terjebak di garis itu. Namun, membuat file non-sementara seperti jawaban khattam berfungsi baik ketika izin diizinkan atau ditolak. Tolong?Tersandung di utas ini mencari contoh untuk seseorang. Hasil pertama di Google, selamat!
Orang-orang berbicara tentang cara Pythonic melakukannya di utas ini, tetapi tidak ada contoh kode sederhana? Ini dia, untuk siapa pun yang tersandung:
Ini mencoba untuk membuka filehandle untuk menulis, dan keluar dengan kesalahan jika file yang ditentukan tidak dapat ditulis ke: Ini jauh lebih mudah dibaca, dan merupakan cara yang jauh lebih baik untuk melakukannya daripada melakukan prechecks pada jalur file atau direktori , karena menghindari kondisi balapan; kasus di mana file menjadi tidak dapat ditulis antara saat Anda menjalankan pemeriksaan awal, dan saat Anda benar-benar mencoba untuk menulis ke file.
sumber
Jika Anda hanya peduli tentang file perm,
os.access(path, os.W_OK)
harus melakukan apa yang Anda minta. Jika Anda justru ingin mengetahui apakah Anda dapat menulis ke direktori,open()
file pengujian untuk ditulis (seharusnya tidak ada sebelumnya), tangkap dan periksa apa sajaIOError
, dan bersihkan file pengujian setelahnya.Secara lebih umum, untuk menghindari serangan TOCTOU (hanya masalah jika skrip Anda berjalan dengan hak istimewa yang lebih tinggi - suid atau cgi atau lebih), Anda tidak boleh benar-benar mempercayai pengujian yang akan dilakukan sebelumnya ini, tetapi jatuhkan privasi, lakukan
open()
, dan harapkan ituIOError
.sumber
Periksa bit mode:
sumber
Ini adalah sesuatu yang saya buat berdasarkan jawaban ChristopheD:
sumber
info lebih lanjut tentang akses dapat ditemukan di sini
sumber
Saya mengalami kebutuhan yang sama ini sambil menambahkan argumen melalui argparse. Bawaan
type=FileType('w')
tidak akan berfungsi untuk saya karena saya sedang mencari direktori. Saya akhirnya menulis metode saya sendiri untuk memecahkan masalah saya. Inilah hasil dengan potongan argparse.Hasilnya sebagai berikut:
Saya kembali dan menambahkan print opts.dir sampai akhir, dan semuanya tampak berfungsi seperti yang diinginkan.
sumber
Jika Anda perlu memeriksa izin pengguna lain (ya, saya menyadari ini bertentangan dengan pertanyaan, tetapi mungkin berguna untuk seseorang), Anda dapat melakukannya melalui
pwd
modul, dan bit mode direktori.Penafian - tidak berfungsi di Windows, karena tidak menggunakan model izin POSIX (dan
pwd
modul tidak tersedia di sana), misalnya - solusi hanya untuk sistem * nix.Perhatikan bahwa direktori harus memiliki semua 3 bit set - Baca, Tulis dan eXecute.
Ok, R bukanlah suatu keharusan mutlak, tetapi tanpa itu Anda tidak dapat mencantumkan entri dalam direktori (jadi Anda harus mengetahui namanya). Eksekusi di sisi lain mutlak diperlukan - tanpa pengguna tidak dapat membaca inode file; jadi meskipun memiliki W, tanpa X file tidak dapat dibuat atau dimodifikasi. Penjelasan lebih detail ada di link ini.
Akhirnya, mode tersedia di
stat
modul, deskripsinya ada di inode (7) man .Kode contoh cara memeriksa:
sumber