मैं कैसे बता सकता हूं कि मेरे पास एक विशेष कमांड चलाने की अनुमति है?


18

क्या यह पहचानने का कोई तरीका है कि क्या मैं एक साधारण उपयोगकर्ता के रूप में कमांड जारी करने का अधिकार रखता हूं।

उदाहरण के लिए; मैं यह जांचना चाहता हूं कि क्या वास्तव में इसे जारी करने से पहले मुझे शटडाउन कमांड जारी करने का अधिकार है।

निम्नलिखित आदेशों की तरह कुछ

-> doIhaveRightToIssue shutdown
-> Yes/No

4
स्ट्रेट-फॉरवर्ड तरीका है (बिना sudo) और पता लगाने के। टेक्स्ट मोड कमांड की आवश्यकता हो सकती है sudoऔर ग्राफिकल कमांड की आवश्यकता हो सकती है gksudo। आप यह भी देख सकते हैं कि कमांड कहाँ स्थापित है which command। यदि में /sbinया /usr/sbin- आप उम्मीद कर सकते हैं कि कमांड की जरूरत है sudoया gksudo
सूदोडुस

जवाबों:


26

सबसे सरल मामला बाइनरी निष्पादन योग्य की तरह है gzip। सबसे पहले, हम निष्पादन योग्य का पता लगाते हैं:

$ which gzip
/bin/gzip

तब हम इस फ़ाइल की विशेषताओं को देखते हैं:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

तीन एक्स हमें बताती है कि फ़ाइल को मालिक द्वारा निष्पादित किया जा सकता है (पहला) root ), या समूह में किसी root(दूसरे root) और किसी और के द्वारा क्रमशः । तो आपके उपयोगकर्ता को प्रोग्राम को निष्पादित करने की अनुमति है।

हालाँकि, आपकी निष्पादन योग्य एक स्क्रिप्ट फ़ाइल हो सकती है जो अन्य निष्पादनयोग्य को अंदर बुलाती है। आप स्क्रिप्ट को निष्पादित करने में सक्षम हो सकते हैं, लेकिन इसके अंदर बुलाए गए कार्यक्रमों को नहीं। यह निर्धारित करने का कोई तरीका नहीं है कि क्या आपके उपयोगकर्ता को ऐसा करने की अनुमति है, वास्तव में इसे बाहर करने की कोशिश करने के अलावा।

फिर ऐसे विशेष मामले हैं shutdown - यह वास्तव में एक कोर उपयोगिता नामक एक प्रतीकात्मक कड़ी है systemctl, जिसका अपना तंत्र है यह निर्धारित करने के लिए कि क्या आपको इसे कॉल करने की अनुमति है, और उदाहरण के लिए, यदि आप नहीं करते हैं तो अपने sudo पासवर्ड के लिए आपसे पूछें। ।

( whichकमांड के बारे में : यह आपके $ PATH में उन निष्पादनयोग्य लोगों का पता लगाता है जिन्हें आपको निष्पादित करने की अनुमति है, और आपको बताता है कि आप जो उपयोग करते हैं यदि आपके पास $ PATH में एक ही नाम के साथ एक से अधिक हैं। यह केवल किसी निष्पादन योग्य का पता नहीं लगाता है। अनुमति के लिए देखने के लिए यहां एक उदाहरण के रूप में उपयोग करें। whichनिष्पादन योग्य पाए जाने वाले तथ्य यह इंगित करते हैं कि आपके पास इसे निष्पादित करने की अनुमति है।)


बहुत संक्षिप्त उत्तर (+1)। उदाहरण के लिए, as-get install का -s फ्लैग (sudo apt-get install -s htop) के परिणाम का अनुकरण करना संभव है। मैंने सोचा है कि अगर एक मुद्दे से पहले कमांड की अनुमति सीखने का कोई तरीका नहीं है, तो कम से कम "अनुकरण" जैसी कोई चीज है।
बर्नहार्ड कोल्बी

निश्चित रूप से, उपयोगिताएँ हैं जो एक "ड्राई-रन" या "अनुकरण" ध्वज प्रदान करती हैं जो आप उपयोग कर सकते हैं।
जोस

4
whichकमांड उन फाइलों के लिए पर्याप्त होना चाहिए जो $PATHचर में जोड़ी गई निर्देशिकाओं में से एक में रहते हैं । उदाहरण के लिए, कोई आउटपुट उत्पन्न करने के लिए करना sudo chmod 700 /bin/nanoया करना। स्थानीय स्क्रिप्ट के लिए, जो निर्देशिकाओं में से एक के अलावा कहीं रहती है , या कॉल ट्रिक करेगी। अच्छा जवाब है, लेकिन कृपया इस जानकारी को अपनी पोस्ट में जोड़ेंsudo chmod 744 nanowhichPATHls -lstat
सर्गी कोलोडियाज़नी

बंद जा रहे हैं क्या Serg ने कहा, कुछ की तरह उपयोग stat -c '%a' /bin/gzipपाने के लिए 755उदाहरण के लिए।
एटी

21

के साथ sudo:

$ sudo -l shutdown
/sbin/shutdown

अगर मेरे पास अनुमति नहीं है, तो मैं sudoकमांड दिखाने के बजाय शिकायत करूंगा।

पोलकिट के साथ, आप उस कार्रवाई की जांच करते हैं जिसे आप चलाना चाहते हैं:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes

प्रासंगिक कार्रवाई खोजना एक अलग सवाल है।


Sudo के साथ समस्या यह है कि मैं सिस्टम में sudoer नहीं हूं। उसके कारण, मैं वास्तव में एक आदेश जारी करने से पहले सावधान रहने की कोशिश करता हूं।
बर्नहार्ड कोल्बी

4
@BernhardColby आप सुरक्षित रूप से चला सकते हैं, sudo -lभले ही आप सूडो न हों - यह पूरी बात है -l- आपको यह बताने के लिए कि क्या आप सूडो के साथ कमांड चला सकते हैं।
मुरु

धन्यवाद (+1), मुझे यह नहीं पता था। जैसे ही मैंने अपना पीसी प्राप्त किया मैं आपके समाधान की कोशिश करूंगा।
बर्नहार्ड कोल्बी

8

आप उपयोग कर सकते हैं:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdown को रास्ता देता है shutdownकमांड के । test -xजांचता है कि वह रास्ता आपके लिए निष्पादन योग्य है या नहीं।

ध्यान दें कि यद्यपि आप कमांड को निष्पादित करने में सक्षम हो सकते हैं, कमांड अभी भी विफल हो सकता है क्योंकि इसमें कार्य को करने के लिए अपर्याप्त अनुमति है। यह यूनिक्स-प्रकार की प्रणालियों पर सामान्य मामला है, जो कमांड को निष्पादित करने के लिए पहुंच को प्रतिबंधित करने के बजाय, उन ऑपरेशनों पर पहुंच को प्रतिबंधित करता है जो प्रोग्राम वास्तव में कर सकते हैं।


उदा के बारे में क्या alias shutdown="shutdown now"?
दिमित्री ग्रिगोरीव

उपनाम के साथ समस्या से बचने के लिए कोई भी उपयोग कर सकता है $(which shutdown)या $(shopt -u expand_aliases && command -v shutdown)। यह समस्या केवल इंटरेक्टिव मोड में दिखाई देती है।
डेविड फ़ॉस्टर 01

5

वैसे यह कई बार थोड़ा मुश्किल हो सकता है ...

सबसे पहले, अनुमतियों को देखें ls -l...

 उपयोगकर्ता समूह के कमांड कमांड
-rxxr-xr-x root bin vim

यदि पिछले / तीसरे ट्रिपल को ए x ("निष्पादित कर सकता है") मिला है, तो अन्य - और इसका मतलब है कि आप - इसे निष्पादित कर सकते हैं ... यदि यह एक शेल-स्क्रिप्ट या ऐसा कुछ है, तो दूसरों को आर की आवश्यकता होगी (") भी पढ़ सकते हैं ”)।

यदि अन्य को निष्पादन-अनुमति नहीं मिलती है, लेकिन समूह (दूसरा ट्रिपल) करता है, तो आप इसे निष्पादित कर सकते हैं यदि आप समूह के सदस्य हैं - उदाहरण के लिए, बिन । उदाहरण के लिए, व्हील- ग्रूप को अक्सर सीमित करने के लिए उपयोग किया जाता है जो चल सकता है su, इसलिए केवल इस समूह से संबंधित उपयोगकर्ता ही इसे निष्पादित कर सकते हैं। एक अन्य उदाहरण विकसित करने के लिए एक समूह बना रहा है , और इस समूह के लिए सी-कंपाइलर और ऐसे उपकरणों के निष्पादन को प्रतिबंधित करता है।

यदि अंतिम ट्रिपल के बाद कोई अनुगमन + होता है , तो इसका मतलब है कि AccessControllLists का उपयोग किया जाता है - यह अतिरिक्त उपयोगकर्ताओं और समूहों के लिए निष्पादन-अधिकार जोड़ सकता है।

+++

यहां तक ​​कि अगर आप कमांड को निष्पादित करने में सक्षम हैं, तो कमांड फ़ाइलों, निर्देशिकाओं और / या उन उपकरणों तक पहुंच पर निर्भर हो सकती है, जिनकी आपके पास पहुंच नहीं है - यह वह सीमा है जो आप कर सकते हैं (आप सक्षम नहीं हो सकते हैं) कुछ भी करना)।

अंत में यद्यपि आपको एक कमांड निष्पादित करने की अनुमति दी जा सकती है, कमांड खुद ही आपकी पहचान की जांच कर सकता है, और आपको इसे तब तक उपयोग करने से इंकार कर सकता है जब तक कि आप एक कॉन्फ़िगर-फ़ाइल में सूचीबद्ध नहीं होते हैं या कुछ उपयोगकर्ता (जैसे रूट ) हैं। उदाहरण के लिए mountकमांड केवल रूट को किसी भी डिवाइस को माउंट करने की अनुमति देगा - सामान्य उपयोगकर्ताओं को केवल / etc / fstab जैसे सूचीबद्ध उपकरणों को माउंट करने की अनुमति है ... जो कोई भी नहीं हो सकता है। यदि आप रूट नहीं कर रहे हैं और कुछ माउंट करने की कोशिश करते हैं, mountतो शिकायत करेंगे और डिवाइस को माउंट करने से इनकार करेंगे। एक और उदाहरण है sudo, जो किसी के लिए भी चलेगा, लेकिन केवल / etc / sudoers में सूचीबद्ध उपयोगकर्ता वास्तव में चीजों को रूट के रूप में चलाने की अनुमति दी जाएगी ।


3

का उपयोग करते हुए which, type, commandआदि एक व्यावहारिक समाधान जो मामलों के 99% में काम करेंगे, लेकिन होने के लिए 100% यकीन है कि यदि आप स्वयं अपनी में सूचीबद्ध हर निष्पादन निर्देशिका का निरीक्षण करना होगा है $PATH। कई गोले (शामिल bash) आपकी कमांड को उपसर्गों से जोड़ेंगे$PATH और उन फाइलों को बार-बार निष्पादित करने का प्रयास करेंगे जब तक कि वे सफल न हो जाएं। चूंकि whichवास्तव में कमांड निष्पादित नहीं कर सकता है, इसलिए यह भविष्यवाणी करना असंभव है कि कौन सी फाइल आपके शेल को वास्तव में ले जाएगी।

उदाहरण के लिए, कल्पना करें कि मेरे पास PATH=/opt/arm/bin:/binदोनों निर्देशिका निष्पादन योग्य फाइलें हैं, लेकिन विभिन्न आर्किटेक्चर के लिए। रनिंग which ddवापस आ जाएगी /opt/arm/bin/dd(यह मानते हुए कि मेरे पास इसे निष्पादित करने की अनुमति है), क्योंकि वह प्रविष्टि पहले आती है। हालाँकि, जब मैं ddअपने शेल में दौड़ता हूँ,/bin/dd निष्पादित किया जाएगा, क्योंकि /opt/arm/bin/ddचलाने में विफल रहेगा। एक ही स्थिति भ्रष्ट बायनेरिज़, लापता लिबास आदि के मामले में हो सकती है। अंत में, यह जानने का कोई निश्चित तरीका नहीं है कि आप एक कमांड को निष्पादित करने में सक्षम होंगे या नहीं, कोशिश करने से अलग।

एक अन्य पहलू यह है कि आप "अनुमतियाँ होने" पर विचार करते हैं। एक उपयोगकर्ता के रूप में, मेरे पास चलाने के लिए अनुमतियाँ हैं, rm ~/fileलेकिन नहीं rm /root/file। फिर, यह जानने का कोई सामान्य तरीका नहीं है कि मैनुअल निरीक्षण के बिना, या आदेश जारी करने और परिणामों का अवलोकन करने के लिए।

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