Python modülü os.chmod (dosya, 664) rw-rw-r— ancak -w - wx ---- iznini değiştirmez


111

Son zamanlarda Python modül işletim sistemini kullanıyorum, bir dosyanın iznini değiştirmeye çalıştığımda beklenen sonucu alamadım. Örneğin, rw-rw-r-- iznini değiştirmek istedim,

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

Sahiplik izni aslında -w - wx --- (230) şeklindedir

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

Bununla birlikte, kodda 664'ü 0664'e değiştirirsem, sonuç tam da ihtiyacım olan şeydir, örn.

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

Sonuç:

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

Doğru sonucu almak için 0'ın neden bu kadar önemli olduğunu açıklamaya yardımcı olan var mı?


33
Sekizli. Sekizli. Sekizli.
Cole Johnson

6
Bugs.python.org/issue25377 adresinde python dokümantasyonu için bir sorun açtım çünkü bu dokümanlardan anlaşılır olmalı.
Karl Richter

Yanıtlar:


130

Bunu farklı bir forumda buldum

Baştaki sıfırın neden önemli olduğunu merak ediyorsanız, bunun nedeni izinlerin sekizlik bir tamsayı olarak ayarlanması ve Python'un otomatik olarak başında sıfır olan herhangi bir tamsayıyı sekizlik olarak ele almasıdır. Yani os.chmod ("dosya", 484) (ondalık olarak) aynı sonucu verecektir.

Yaptığınız şey 664sekizlik tabanda geçmektir.1230

Senin durumunda ihtiyacın olacak

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

[Güncelle] Not, Python 3 için 0o (sıfır oh) ile önekiniz var. ÖRNEĞİN,0o666


1
Teşekkürler, ama yine de kafam karıştı, ondalık olarak 484, sekizlik olarak 744 anlamına geliyor, bu da forumda bahsettiğiniz başlıkta mantıklı. Ancak ondalık olarak 644 verirsem sekizlik olarak 1204'e gider. 1204, sekizlik tabanda 230 ile nasıl ilişkilidir?
AplusG

2
@AplusG: 1edilir değil atılır! Bu yapışkan / setuid / setgid bitidir ve 1 anlamına gelir sticky. ls -lSizi kullanarak izinlerin Tsonunda bir de dahil olduğunu fark edebilirsiniz ...
MestreLion

2
0'ı eklemek ve sekizlik yapmak daha kolay :)
radtek

10
Python 3 için 0o (sıfır oh) ön ekiniz olduğunu unutmayın.
Mawg, Monica'yı

1
Python 2.7.10'da 0o kullanıyorum
Wyrmwood

125

Yani, şuna benzer anlambilim isteyenler için:

$ chmod 755 somefile

kullanın:

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

Python'unuz 2.6'dan daha eskiyse:

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

12
Python3 formatı python 2.7.9'da da çalışır. Daha önceki sürümleri kontrol etmedim.
Fred Mitchell

3
Python 3 sözdizimi, Python 2.6'ya geri dönmektedir docs.python.org/3/whatsnew/…
Pete

Benim için çalış tks!
LandiLeite

Muhtemelen 00755, sadece suid / sgid / yapışkan bitlerin nereye gittiğini açıklığa kavuşturmak için, daha sonra bir geliştiricinin gelip bu eski betiği kullanmasını isterse, örneğin, sgid ile birlikte, 2755ancak sonra nedenini çözemezse permalar tamamen mahvoldu. ;)
dannysauer

10

önde gelen 0, bunun sekizlik olduğu anlamına gelir , bunun ondalık değil sabit . ve dosya modunu değiştirmek için sekizlik tabana ihtiyacınız var.

izinler biraz maskesi, örneğin, rwxrwx---bir111111000 ikilik sistemde ve ondalık gösterim hesapla daha sekizlik biçime dönüştürmek için 3 ile grup bite çok kolaydır.

0644(sekizlik) 0.110.100.100ikili (okunabilirlik için noktalar ekledim) veya hesaplayabileceğiniz 420gibi ondalık sayıdadır.


5

Sayılar yerine izin sembollerini kullanın

Ham sihirli sayılar yerine daha anlamsal olarak adlandırılmış izin sembollerini kullansaydınız, sorununuz önlenirdi, örneğin 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
)

Bu, https://docs.python.org/3/library/os.html#os.chmod adresinde belgelenmiştir ve adlar , adresinde belgelenen POSIX C API değerleriyle aynıdır man 2 stat.

Diğer bir avantaj, belgelerde belirtildiği gibi daha fazla taşınabilirliktir:

Not: Windows desteklese de chmod(), onunla yalnızca dosyanın salt okunur bayrağını ayarlayabilirsiniz ( stat.S_IWRITEve stat.S_IREADsabitleri veya karşılık gelen bir tamsayı değeri aracılığıyla). Diğer tüm bitler dikkate alınmaz.

chmod +xEn gösterilmiştir: nasıl piton içinden bir basit "chmod + x" yapacağım?

Ubuntu 16.04, Python 3.5.2'de test edilmiştir.


1
Sorunla başa çıkmanın doğru yolu budur.
carthurs

Bunun piton yolu olduğunu biliyorum ama daha çirkin olamaz :)
Tomasz Swider

2

Dizeye kaydedilmiş istediğiniz izinlere sahipseniz, yapın

s = '660'
os.chmod(file_path, int(s, base=8))

0

Stat. * Bit maskelerini kullanmak bana bunu yapmanın en taşınabilir ve açık yolu gibi görünüyor. Ama öte yandan, bununla en iyi nasıl başa çıkılacağını çoğu zaman unutuyorum. Öyleyse, burada 'grup' ve 'diğer' izinleri maskeleme ve 'sahip' izinlerini el değmeden bırakmanın bir örneği var. Bit maskeleri kullanmak ve çıkarma yararlı bir modeldir.

import os
import stat
def chmodme(pn):
    """Removes 'group' and 'other' perms. Doesn't touch 'owner' perms."""
    mode = os.stat(pn).st_mode
    mode -= (mode & (stat.S_IRWXG | stat.S_IRWXO))
    os.chmod(pn, mode)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.