2008-09-18 9 views
5

मैं वर्चुअल फ़ाइल को खोजने का प्रयास कर रहा हूं जिसमें वर्तमान उपयोगकर्ता आईडी है। मुझे बताया गया था कि मैं इसे proc निर्देशिका में पा सकता हूं, लेकिन यह सुनिश्चित नहीं करता कि कौन सी फाइल है।यूनिक्स प्रो निर्देशिका

उत्तर

8

आप वास्तव में /proc/self/status चाहते हैं, जो आपको वर्तमान में निष्पादित प्रक्रिया के बारे में जानकारी देगा।

$ cat /proc/self/status 
Name: cat 
State: R (running) 
Tgid: 17618 
Pid: 17618 
PPid: 3083 
TracerPid:  0 
Uid: 500 500 500 500 
Gid: 500 500 500 500 
FDSize: 32 
Groups: 10 488 500 
VmPeak:  4792 kB 
VmSize:  4792 kB 
VmLck:   0 kB 
VmHWM:  432 kB 
VmRSS:  432 kB 
VmData:  156 kB 
VmStk:  84 kB 
VmExe:  32 kB 
VmLib:  1532 kB 
VmPTE:  24 kB 
Threads: 1 
SigQ: 0/32268 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000000000 
SigCgt: 0000000000000000 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
Cpus_allowed: 00000003 
Mems_allowed: 1 
voluntary_ctxt_switches: 0 
nonvoluntary_ctxt_switches: 3 

आप शायद UID और Gid तर्ज पर पहली संख्या को देखने के लिए चाहते हैं:

यहाँ एक उदाहरण है। आप /etc/passwd पर देखकर उपयोगकर्ता नाम के लिए कौन से यूआईडी नंबर मैप देख सकते हैं, या आप जो भी भाषा इस्तेमाल कर रहे हैं, उसमें यूज़रने के लिए यूआईडी मैपिंग के लिए प्रासंगिक कार्यों को कॉल कर सकते हैं।

आदर्श रूप से, आप इस जानकारी को देखने के लिए सिस्टम कॉल getuid() पर कॉल करेंगे, इसे /proc/ पर देखकर इसे प्रतिकूल बना दिया गया है।

+1

आपको कभी भी/etc/passwd खुद को पार्स नहीं करना चाहिए, क्योंकि अधिकांश आधुनिक सिस्टम पीएएम का उपयोग करते हैं, और उस स्थिति में उपयोगकर्ता डेटाबेस/etc/passwd नहीं हो सकता है, लेकिन इसके बजाय एनआईएस, एलडीएपी सर्वर या पूरी तरह से कुछ हो सकता है विभिन्न। – jfs

3

मुझे यकीन नहीं है कि /proc में पाया जा सकता है। आप getuid() फ़ंक्शन या $USER पर्यावरण चर का उपयोग करने का प्रयास कर सकते हैं।

6

क्यों न केवल "id -u" का उपयोग करें?

2

अधिकतर, आप या तो $USER पर्यावरण चर देखना चाहते हैं। अन्य विकल्पों में getuid और id -u शामिल हैं, लेकिन /proc खोजना निश्चित रूप से कार्रवाई का सबसे अच्छा तरीका नहीं है।

3

जहां तक ​​मुझे पता है, /proc लिनक्स के लिए विशिष्ट है, यह सामान्य रूप से यूनिक्स में नहीं है। यदि आप वास्तव में केवल वर्तमान यूआईडी चाहते हैं, तो getuid() या geteuid() फ़ंक्शन का उपयोग करें।

यदि आप जानते हैं कि आप केवल लिनक्स पर होंगे, तो आप /proc/self/* के तहत पदानुक्रम का पता लगा सकते हैं, इसमें वर्तमान प्रक्रिया के बारे में विभिन्न जानकारी शामिल है। याद रखें कि /proc "जादुई" है, यह एक वर्चुअल फाइल सिस्टम है जो कर्नेल परोसता है और जिस बिंदु पर आप अनुरोध करते हैं उस पर सामग्री गतिशील रूप से जेनरेट की जाती है। इसलिए यह वर्तमान प्रक्रिया के लिए विशिष्ट जानकारी वापस कर सकता है।

उदाहरण के लिए, इस आदेश का प्रयास करें: cat /proc/self/status

1

/proc/process_id/status में (कम से कम लिनक्स पर) आप इस तरह की एक पंक्ति मिल जाएगा:

Uid:  1000 1000 1000 1000

यह आपको जिसका तहत उपयोगकर्ता का UID बताता है खाता चल रहा है प्रक्रिया।

हालांकि, वर्तमान प्रक्रिया की प्रक्रिया आईडी को जानने के लिए आपको सिस्टम कॉल की आवश्यकता होगी, और फिर आप सीधे यूआईडी प्राप्त करने के लिए getuid पर कॉल कर सकते हैं।

संपादित करें: आह, /proc/self/status ... हर दिन कुछ नया सीखना!

0

जो चीजें आप खोज रहे हैं वे पर्यावरण चर में हो सकती हैं। जब आप पर्यावरण चर की जांच करते हैं तो आपको सावधान रहना होगा कि आप किस शैल का उपयोग कर रहे हैं। बैश "यूआईडी" का उपयोग करता है जबकि टीसीएस "यूआईडी" का उपयोग करता है और *nix केस मामलों में। मैंने यह भी पाया है कि tcsh "gid" सेट करता है लेकिन मैं बैश में मिलान करने वाला चर नहीं ढूंढ पा रहा था।