पायथन मॉड्यूल os.chmod (फ़ाइल, 664) rw-rw-r- but -w - wx ---- की अनुमति को नहीं बदलता है


111

हाल ही में मैं पायथन मॉड्यूल ओएस का उपयोग कर रहा हूं, जब मैंने फ़ाइल की अनुमति को बदलने की कोशिश की, तो मुझे अपेक्षित परिणाम नहीं मिला। उदाहरण के लिए, मैंने 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 महत्वपूर्ण है?


33
ऑक्टल। ऑक्टल। ऑक्टल।
कोल जॉन्सन

6
मैंने Bugs.python.org/issue25377 पर अजगर प्रलेखन के लिए एक मुद्दा खोला क्योंकि यह डॉक्स से स्पष्ट होना चाहिए।
कार्ल रिक्टर

जवाबों:


130

यह एक अलग मंच पर मिला

यदि आप सोच रहे हैं कि अग्रणी शून्य क्यों महत्वपूर्ण है, तो यह इसलिए है क्योंकि अनुमतियाँ एक ऑक्टल पूर्णांक के रूप में सेट की जाती हैं, और पायथन स्वचालित रूप से किसी भी पूर्णांक को अष्टक के रूप में अग्रणी मानता है। तो os.chmod ("फ़ाइल", 484) (दशमलव में) एक ही परिणाम देगा।

तुम 664जो कर रहे हो वह गुजर रहा है जो अष्टक में है1230

आपके मामले में आपको आवश्यकता होगी

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

[अद्यतन] ध्यान दें, पायथन ३ के लिए आपके पास ०o (शून्य ओह) के साथ उपसर्ग है। ईजी,0o666


1
धन्यवाद, लेकिन मैं अभी भी उलझन में हूँ कि, दशमलव में 484 का अर्थ है अष्टक में 744, जो आपके द्वारा मंच में उल्लिखित धागे में समझ में आता है। हालांकि, अगर मैं दशमलव में 644 देता हूं, तो यह ऑक्टल में 1204 हो जाता है। ऑक्टल में 1204 230 से कैसे संबंधित है?
5

2
@AplusG: 1है नहीं खारिज कर दिया! यह चिपचिपा / सेट्युड / सेटगिड बिट और 1 साधन है stickyls -lअब आप अनुमतियों का उपयोग करते Tहुए अंत में एक को शामिल कर सकते हैं ...
MestreLion

2
0 को जोड़ना आसान है और इसे
अष्टाकार

10
ध्यान दें, पायथन 3 के लिए आपके पास 0o (शून्य ओह) के साथ उपसर्ग है।
मावग का कहना है कि मोनिका

1
मैं अजगर में 0o का उपयोग करता हूँ 2.7.10
Wyrmwood

125

तो ऐसे लोगों के लिए जो शब्दार्थ चाहते हैं:

$ chmod 755 somefile

उपयोग:

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

यदि आपका अजगर 2.6 से अधिक पुराना है:

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

12
Python3 प्रारूप अजगर 2.7.9 में भी काम करता है। मैंने पहले के संस्करणों की जाँच नहीं की है।
फ्रेड मिशेल

3
Python 3 सिंटैक्स Python 2.6 docs.python.org/3/whatsnew/… पर
Pete

मेरे लिए काम tks!
लैंडलीलाइट

शायद होना चाहिए 00755, यह स्पष्ट करने के लिए कि suid / sgid / चिपचिपा बिट्स कहाँ जाते हैं, इस घटना में कि बाद में कोई डेवलपर आता है और इस पुरानी स्क्रिप्ट का उपयोग करना चाहता है, उदाहरण के लिए, sgid के साथ 2755लेकिन फिर यह पता नहीं लगा सकता कि क्यों परमिट पूरी तरह से खराब हो गए हैं। ;)
dannysauer

10

प्रमुख का 0मतलब यह अष्टक स्थिर है, दशमलव एक नहीं। और आपको फ़ाइल मोड को बदलने के लिए एक ऑक्टल की आवश्यकता है।

अनुमतियाँ हैं थोड़ा मुखौटा, उदाहरण के लिए, rwxrwx---है 111111000बाइनरी में, और यह 3 से समूह बिट्स के लिए बहुत आसान है अष्टाधारी में बदलने के लिए, calculate से दशमलव प्रतिनिधित्व।

0644(ऑक्टल) 0.110.100.100बाइनरी में है (मैंने पठनीयता के लिए डॉट्स जोड़े हैं), या, जैसा कि आप गणना कर सकते हैं, 420दशमलव में।


5

संख्या के बजाय अनुमति प्रतीकों का उपयोग करें

आपकी समस्या से बचा जाता अगर आपने कच्चे जादू की संख्या के बजाय अधिक शब्दार्थ अनुमति प्रतीकों का उपयोग किया होता, जैसे 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_IWRITEऔर stat.S_IREADस्थिरांक या संबंधित पूर्णांक मान के माध्यम से)। अन्य सभी बिट्स को अनदेखा किया जाता है।

chmod +xपर प्रदर्शित किया जाता है: आप अजगर के भीतर से एक सरल "chmod + x" कैसे करते हैं?

उबंटू 16.04, पायथन 3.5.2 में परीक्षण किया गया।


1
यह समस्या से निपटने का सही तरीका है।
कार्टरस

मैं इस तरह से अजगर को जानता हूं, लेकिन यह शायद ही कोई बदसूरत हो सकता है :)
टॉमस ज़ूडर

2

यदि आपके पास स्ट्रिंग करने के लिए वांछित अनुमतियाँ हैं तो करें

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

0

स्टेट का उपयोग करना। * बिट मास्क मुझे ऐसा करने का सबसे पोर्टेबल और स्पष्ट तरीका लगता है। लेकिन दूसरी ओर, मैं अक्सर भूल जाता हूं कि इसे कैसे संभालना सबसे अच्छा है। इसलिए, यहां 'समूह' और 'अन्य' अनुमतियों को हटाने और 'स्वामी' अनुमतियों को अछूता रखने का एक उदाहरण है। बिटमास्क और घटाव का उपयोग करना एक उपयोगी पैटर्न है।

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.