किसी फ़ाइल की समूह अनुमतियों का निरीक्षण कैसे करें


9

मैं किसी bash स्क्रिप्ट से किसी फ़ाइल की समूह अनुमतियों का निरीक्षण करना चाहूंगा। विशेष रूप से, मुझे यह जांचने की आवश्यकता है कि क्या फ़ाइल में समूह लेखन योग्य है।

बस। इतना ही आसान। तथापि:

  1. मुझे पोर्टेबल होने के लिए भी इसकी आवश्यकता है।
  2. test -w <file मुझे नहीं बताएगा कि क्या यह समूह लेखन योग्य है।
  3. उत्पादन ls -ldमनुष्यों के लिए अच्छा है, लेकिन लिपियों के बारे में इतना सुनिश्चित नहीं है। तकनीकी रूप से मैं आउटपुट को पार्स कर सकता हूं जैसे drwxrwxr-xकि समूह बिट्स को निकालने के लिए, लेकिन यह भंगुर लगता है।
  4. statओएस एक्स और अन्य प्रणालियों के बीच इंटरफ़ेस पूरी तरह से असंगत है।
  5. find <file> -perm ... संभवतः उत्तर नहीं हो सकता है?

क्या आपको समूह अनुमति बिट की जांच करने की आवश्यकता है, या क्या आपको यह जांचने की आवश्यकता है कि क्या किसी विशिष्ट समूह ने अनुमतियाँ लिखी हैं? समूह (या उपयोगकर्ता) एक एसीएल के माध्यम से अनुमति लिख सकता है।
गिल्स एसओ- बुराई को रोकें '23

बस समूह अनुमति बिट। कोई विशिष्ट समूह प्रासंगिक नहीं है।
मिसल

जवाबों:


8

विधि # 1 - प्रतिमा

आप statअनुमति बिट्स प्राप्त करने के लिए कमांड का उपयोग कर सकते हैं । statअधिकांश यूनिक्स (OSX, BSD पर उपलब्ध है, AIX से नहीं जो मुझे मिल सकता है)। यह सबसे अधिक यूनिक्स पर काम करना चाहिए, सिवाय OSX और बीएसडी के जो मुझे मिल सकता है।

$ stat -c "%a" <file>

उदाहरण

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

इस कमांड का उपयोग करें:

$ stat -c "%a" afile.txt
664

और grepयह देखने के लिए कि समूह अनुमतियाँ मोड 6 या 7 है, एक साधारण का उपयोग करें ।

$ stat -c "%a" afile.txt | grep ".[67]."

के लिए OSX और बीएसडी आप के लिए इस प्रपत्र का उपयोग करना होगा stat, stat -f(या शायद stat -x), और उसके अनुसार पार्स। चूंकि विकल्प statअलग हैं आप इस कमांड को कमांड में लपेट सकते हैं lsb_release -aऔर ओएस पर आधारित उपयुक्त संस्करण को कॉल कर सकते हैं। आदर्श नहीं बल्कि काम करने योग्य है। एहसास करें कि lsb_releaseयह केवल लिनक्स डिस्ट्रोस के लिए उपलब्ध है, इसलिए अन्य यूनिक्स ओएस के परीक्षण के लिए एक और विकल्प तैयार करना होगा।

विधि # 2 - खोजें

मुझे लगता है कि यह कमांड आपको बेहतर सेवा दे सकती है। मैं findऔर printfस्विच का उपयोग करता है ।

उदाहरण

$ find a -prune -printf '%m\n'
664

विधि # 3 - पर्ल

पर्ल आपके द्वारा कवर करने की कोशिश कर रहे OSes के आधार पर ऐसा करने के लिए एक अधिक पोर्टेबल तरीका हो सकता है।

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

नोट: उपरोक्त stat()फ़ाइल सिस्टम बिट्स को क्वेरी करने के लिए पर्ल के फ़ंक्शन का उपयोग करता है।

किसी सरणी का उपयोग करके @pv, और stat()सीधे आउटपुट के साथ काम करके आप इसे और अधिक कॉम्पैक्ट बना सकते हैं :

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

मुझे लगता है कि आप उसकी बात चूक गए। statकमांड विभिन्न प्रणालियों के बीच व्यापक रूप से भिन्न है और पोर्टेबल नहीं है।
जोर्डनम

@ जोर्डनम - धन्यवाद मैंने इसे देखा, एक विकल्प की तलाश में था। मुझे लगता है कि find . -printfयह कर सकता है, लेकिन यह निर्धारित नहीं कर सकता है कि यह OSX की खोज पर उपलब्ध है या नहीं।
स्लम

1
मुझे यह POSIX2008 गाइड में संदर्भित नहीं मिला, इसलिए मैं सहमत हूं। मैं किसी भी अन्य तरीकों के बारे में सुनिश्चित नहीं हूं। मुझे लगता है कि आपको यहां बुलेट को काटने और ओएस का पता लगाने और एप्रॉप को कॉल करना होगा। कमांड, सबसे अच्छा तरीका प्रतीत होगा।
स्लम

1
मैं एक मानक शेल उपयोगिता का उपयोग करके एक विधि के बारे में सोच भी नहीं सकता था। इसलिए मेरा जवाब पर्ल का उपयोग करता है।
जोर्डनम

1
@ जोर्डनम - महान दिमाग। मैं एक पर्ल्स सॉल्यूशन पर भी 8-) काम कर रहा था
slm

2

मैंने समाप्त कर दिया है ls-पार्सिंग:

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

मैं @ स्लम के व्यापक उत्तर के लिए आभारी हूं, लेकिन अन्य तरीकों में से कोई भी सीधा नहीं है। इस statविधि से मुझे OS X को कवर करने के लिए कम से कम दो अलग-अलग इनवाइट लिखने होंगे, और इसके बाद भी यह ऑक्टल प्रतिनिधित्व को लौटाता है, जो मुझे अभी भी अंकगणित को लागू करना है। पर्ल विधि ठीक है, लेकिन मुझे इस तरह के एक सरल कार्य के लिए एक दुभाषिया शुरू करने की आवश्यकता है, और मैं इसे सरल रखना और केवल पॉज़िक्स बर्तनों का उपयोग करना चाहूंगा।


2
आप बस पॉश नहीं, बैश का उपयोग कर रहे हैं। POSIX में:perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
गाइल्स का SO- रोकना बुराई है '

1

एक विकल्प का उपयोग करना है perl, जो हर जगह पोर्टेबल होगा perlउपलब्ध है। इसके बिना यूनिक्स प्रणाली खोजना कठिन है। यह एक उदाहरण है कि इसे शेल स्क्रिप्ट में कैसे एकीकृत किया जा सकता है:

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

इसी तरह के perlउदाहरण स्टेट पेरोलोक में पाए जा सकते हैं ।


0
FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

सभी मानक यूनिक्स / लिनक्स उपकरण।

मुझे लगता है कि समूह लेखन के लिए यह POSSIBLE है, लेकिन समूह पढ़ा नहीं गया है। इस संभावना में, यह या तो एक केस स्टेटमेंट 2 | 3 | 6 | 7) या एक grep '[[3 | 3 | 6 | 7]' होगा।

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