2014-09-11 5 views
7

बनाता है मैं myCreate.py कहा जाता अजगर स्क्रिप्ट का एक सरल टुकड़ा लिनक्स पर चल रहा है:
fo = open("./testFile.txt", "wb")sudo का उपयोग कर अजगर के साथ एक फ़ाइल बनाना उसके मालिक जड़

जब मैं अजगर ./myCreate.py चलाने - के मालिक testFile.txt मेरे उपयोगकर्ता रहता है। जब मैं सूडो पायथन चलाता हूं ./myCreate.py - testFile.txt का मालिक अब रूट है।

testFile.txt फांसी

दोनों के लिए पहले से नहीं चल रहा था

मैं कैसे फ़ाइल के मालिक वास्तविक उपयोगकर्ता और नहीं प्रभावी उपयोगकर्ता रहना कर सकते हैं ?! धन्यवाद!

+0

'यह chown' बनाने के बाद। –

+0

मैं इसे वास्तविक उपयोगकर्ता के रूप में खोलना चाहता हूं, यह किसके बारे में है ... यह कुछ कठिन कोड नहीं है – ABR

+0

आप वर्तमान उपयोगकर्ता को निर्धारित कर सकते हैं और उस पर दिखाया जा सकता है। –

उत्तर

6

sudo के साथ अपनी स्क्रिप्ट चल रहा है मतलब है कि आप रूट के रूप में इसे चलाने के। तो यह सामान्य है कि आपकी फाइल रूट के स्वामित्व में है।

आप जो भी कर सकते हैं वह फ़ाइल के स्वामित्व को बनाए जाने के बाद बदलना है। ऐसा करने के लिए, आपको यह जानने की जरूरत है कि कौन सा उपयोगकर्ता सुडो चलाता है। सौभाग्य से, SUDO_UID पर्यावरण चर है जो आप सूडो का उपयोग करते समय सेट किया गया है।

तो, आप कर सकते हैं:

os.chown("path/to/file", uid, gid) 

यदि हम यह एक साथ रखा:

import os 
print(os.environ.get('SUDO_UID')) 

उसके बाद, आप change the file ownership की जरूरत

import os 

uid = int(os.environ.get('SUDO_UID')) 
gid = int(os.environ.get('SUDO_GID')) 

os.chown("path/to/file", uid, gid) 
बेशक

लिए, आप इसे एक समारोह के रूप में चाहते हैं, क्योंकि यह अधिक सुविधाजनक है, इसलिए:

import os 

def fix_ownership(path): 
    """Change the owner of the file to SUDO_UID""" 

    uid = os.environ.get('SUDO_UID') 
    gid = os.environ.get('SUDO_GID') 
    if uid is not None: 
     os.chown(path, int(uid), int(gid)) 

def get_file(path, mode="a+"): 
    """Create a file if it does not exists, fix ownership and return it open""" 

    # first, create the file and close it immediatly 
    open(path, 'a').close() 

    # then fix the ownership 
    fix_ownership(path) 

    # open the file and return it 
    return open(path, mode) 

उपयोग:

# If you just want to fix the ownership of a file without opening it 
fix_ownership("myfile.txt") 

# if you want to create a file with the correct rights 
myfile = get_file(path) 

संपादित करें: @Basilevs करने के लिए अपने जवाब के लिए धन्यवाद अपडेट किया गया, @ Robᵩ और @ 5gon12eder

+0

ग्रेट स्पष्टीकरण, लेकिन 'SUDO_UID'' SUDO_USER' से अधिक सुविधाजनक नहीं होगा? –

+0

@ रोब या यहां तक ​​कि सुरक्षित? – Basilevs

+0

यदि 'SUDO_USER' सेट नहीं है तो यह फ़ाइल को 'बोया' नहीं बल्कि अधिक पोर्टेबल होगा। – 5gon12eder

2

पहले os.stat का उपयोग करने के बारे में पहले युक्त फ़ोल्डर की अनुमतियां प्राप्त करें और फिर उन्हें फ़ाइल पोस्ट निर्माण में लागू करें।

इस तरह (को Python2 का प्रयोग करके) कुछ ऐसा दिखाई देगा:

import os 

path = os.getcwd() 
statinfo = os.stat(path) 

fo = open("./testFile.txt", "wb") 
fo.close() 
euid = os.geteuid() 
if (euid == 0) # Check if ran as root, and set appropriate permissioning afterwards to avoid root ownership 
    os.chown('./testFile.txt', statinfo.st_uid, statinfo.st_gid) 

इलियट के रूप में बताया है, यदि आप एक साथ कई फाइलों को सृजित किया जाए, तो यह एक समारोह के रूप में बेहतर संरचित किया जाएगा।

2

उपयोग os.chown(), os.environ का उपयोग कर उचित प्रयोक्ता आईडी को खोजने के लिए:

import os 

fo = open("./testFile.txt", "wb") 
fo.close() 
os.chown('./testFile.txt', 
     int(os.environ['SUDO_UID']), 
     int(os.environ['SUDO_GID'])) 
संबंधित मुद्दे