सूडो - क्या मेरे पास सूडो और / या कितना समय बचा है यह जांचने के लिए एक कमांड है?


27

(मूल रूप से स्टैक ओवरफ्लो पर पोस्ट किया गया। उन्होंने सुझाव दिया कि मैं इसके बजाय यहां कोशिश करता हूं। यहां मूल पोस्ट है: /programming/3858208/sudo-is-there-a-command-to-check-if-i-have -sudo और या कि कैसे-बहुत समय है-बाएँ )

शीर्षक देखें। मैं एक कमांड चाहता हूं जो मुझे सुडोलो को क्वेरी करने देता है। आदर्श रूप से यह सफलता लौटाएगा अगर मेरे पास अभी भी सूडो और झूठे हैं अगर सूडो की समय सीमा समाप्त हो गई है। बचे हुए समय को प्राप्त करना भी उपयोगी हो सकता है (हालाँकि अगर मैं चिंतित था कि मैं सिर्फ sudo -v को फिर से अमान्य कर सकता हूँ।) ओह और इसके लिए पासवर्ड नहीं मांगना चाहिए।

निकटतम चीज़ जो मैंने पाया है वह "sudo -n true" है, लेकिन -n विकल्प केवल काम पर मेरी Centos 5 मशीन पर मौजूद है। -इसके लिए पासवर्ड मांगना पड़ता है तो वह विफल हो जाता है। क्या यह कार्यक्षमता प्राप्त करने का कोई अन्य तरीका है? मुझे लगता है कि वास्तव में मेरे साथ काम करने वाली सभी मशीनों पर जड़ नहीं है, इसलिए मैं अपनी पसंद के अनुसार सुडोल के नए संस्करण स्थापित नहीं कर सकता।

इसके लायक मैं ऐसा कर रहा हूं ताकि मैं सूडो स्टेटस का संकेत देने के लिए अपना संकेत पा सकूं। मुझे यह जानना पसंद है कि कौन से टर्मिनल सक्रिय रूप से सूद-सक्षम हैं। मेरे पास एक संकेत भी है कि जब मैं जड़ हूं तो रंग बदलता है, लेकिन मैं बहुत बार रूट का उपयोग नहीं करता हूं इसलिए यह सीमित उपयोग है।

जवाबों:


10

-nविकल्प sudo के नए संस्करण में उपलब्ध है, लेकिन जैसा कि आप ने कहा कि एक विकल्प नहीं है। ऐसा करने का कोई वास्तविक तरीका नहीं है कि आप सिर्फ सुडोल की कोशिश कर रहे हैं और यह देख रहे हैं कि क्या यह पासवर्ड के लिए संकेत देता है। यदि आपकी चिंता यह है कि आप एक दृश्य संकेत चाहते हैं, तो रूट बैश सत्र शुरू करने के लिए sudo / bin / bash क्यों नहीं शुरू करें? ध्यान दें कि यह असुरक्षित है, लेकिन यह भी कुछ हद तक असुरक्षित है अगर किसी को सूडो पर आपके त्वरित परिवर्तन का एहसास होता है।


1
एक दृश्य संकेतक की सुरक्षा के लिए +1!
अगली सूचना तक रोक दिया गया।

वह हिस्सा मेरे पास नहीं हुआ था। मैं जो उम्मीद कर रहा हूं कि संकेतक मुझे सुडो-के को चलाने के लिए याद दिला रहे हैं, भूल जाने के बजाय मैंने सूडो को सक्रिय छोड़ दिया और कुछ संभावित खतरनाक टर्मिनलों को खुला छोड़ दिया। ऐसा नहीं है कि मैं अक्सर अपनी स्क्रीन लॉक करना भूल जाता हूं, लेकिन मुझे अतिरिक्त बीमा पसंद है।
वलदिल

फिलहाल मैं सूडो-वी की जाँच करने के लिए झुक रहा हूँ, और अगर यह पर्याप्त है पर्याप्त है के लिए एक, अधिसूचना प्राप्त करने के लिए जाँच कर रहा है। ऐसा लगता है कि कहीं भी कुछ भी नहीं टूटना चाहिए।
वलदिल

@valadil: यह मेरे लिए होता है कि एक सूक्ष्म संकेतक बहुत अधिक सुरक्षा जोखिम पेश नहीं करेगा। उदाहरण के लिए, प्रॉम्प्ट में उपयोगकर्ता नाम के लिए अंडरलाइनिंग चालू करें।
अगली सूचना तक रोक दिया गया।

@ डेनिस: बिल्कुल सही। मैं अपने प्रॉम्प्ट को "OMG_YOU_HAVE_SUDO_NOW! _User @ host" या कुछ इस तरह बदलने वाला नहीं था। मैं शायद रंग को थोड़ा बदल दूंगा। मैं किसी से भी यह जानने की उम्मीद नहीं करता कि इसका क्या मतलब है जब तक कि वे नीचे बैठकर मेरे .bashrc के साथ अंतरंग न हों।
वलदिल

29

मुझे पता है कि यह वास्तव में एक पुराना सवाल है लेकिन यहाँ मैंने आज एक स्क्रिप्ट में किया है:

CAN_I_RUN_SUDO = $ (sudo -n uptime 2> & 1 | grep "load" | wc -l)
अगर [$ {CAN_I_RUN_SUDO} -gt 0]
फिर
    गूंज "मैं सूडो कमांड चला सकता हूं"
अन्य
    गूंज "मैं सूडो कमांड नहीं चला सकता"
फाई

1

नीचे दिए गए आदेश में एक रंगीन संकेत दिखाई देगा कि आपने सूडो प्रदान किया है, इसलिए आपको sudo -kमशीन से दूर जाने से पहले याद रखना चाहिए । यह गैर-रंगीन टर्मिनलों पर भी उपयोगी है।

जैसा कि हम अलग-अलग टर्मिनल सत्रों में सक्रिय और निष्क्रिय हो सकते हैं, मैंने इसे बनाया है जिसे आप अपने ~ / .brc के अंत में रख सकते हैं।

function FUNCpromptCommand () { 
    sudo -n uptime 2>/dev/null 1>/dev/null
  local bSudoOn=`if(($?==0));then echo true; else echo false; fi`

    history -a; # append to history at each command issued!!!
    local width=`tput cols`;
    local half=$((width/2))
    local dt="[EndAt:`date +"%Y/%m/%d-%H:%M:%S.%N"`]";
  if $bSudoOn; then dt="!!!SUDO!!!$dt"; fi
    local sizeDtHalf=$((${#dt}/2))
    #printf "%-${width}s" $dt |sed 's" "="g'; 
    echo
    output=`printf "%*s%*s" $((half+sizeDtHalf)) "$dt" $((half-sizeDtHalf)) "" |sed 's" "="g';`

    local colorLightRed="\e[1;31m"
  local colorNoColor="\e[0m"
    if $bSudoOn; then
        echo -e "${colorLightRed}${output}${colorNoColor}"
    else
        echo -e "${output}"
    fi
}
export PROMPT_COMMAND=FUNCpromptCommand

bashयह परीक्षण करने के लिए टर्मिनल प्रकार पर। यह हर बार जब आप किसी कमांड को निष्पादित करते हैं तो एक पूरी लाइन जोड़ देगा, जिसमें अंतिम कमांड के समाप्त होने की समय की जानकारी होती है, इसलिए आप दोपहर का भोजन कर सकते हैं और जान सकते हैं कि अंतिम कमांड कब समाप्त हुई :)।

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

पुनश्च: ओएस-एक्स के लिए, @nwinkler द्वारा नीचे टिप्पणी के लिए देखें।


sudo -nOS X पर काम करने का एग्जिट कोड नहीं लगता है। मेरा सवाल यहाँ देखें: superuser.com/questions/902826/…
nwinkler

अच्छी तरह से, मैं जिस प्रस्ताव का प्रस्ताव करता हूं sudo -n, क्या आप मानते हैं कि कोई अन्य परीक्षण हो सकता है जो यह निर्धारित करने के लिए इस्तेमाल किया जा सकता है कि क्या उपयोगकर्ता के पास सूडो एक्सेस सक्रिय है? या शायद OS-X को कुछ अपडेट की आवश्यकता है? मैंने कभी OS-X btw का उपयोग नहीं किया।
कुम्भ पावर

2
मैं ओएस एक्स के नवीनतम संस्करण का उपयोग कर रहा हूं। यह संभव है कि sudo -nबीएसडी (जो ओएस एक्स पर आधारित है) जीएनयू संस्करण की तुलना में एक अलग व्यवहार है। मैंने अभी अपनी टिप्पणी जोड़ी है ताकि लोगों को पता चले कि चेक का यह संस्करण OS X पर काम नहीं करता है। मैंने दूसरे उत्तर से चेक का उपयोग किया है ( sudo -n uptime 2>&1|grep "load"|wc -l), और यह OS X पर ठीक काम करता है। यह उतना सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है।
nwinkler

1
@nwinkler ओह, इसलिए यह वास्तव में आउटपुट पर निर्भर करता है कि यह जेनरेट करता है (रिटर्न वैल्यू नहीं), दिलचस्प वर्कअराउंड
कुंभ पावर

@nwinkler लेकिन यह जितना संभव हो उतना निकट है। या इससे भी बेहतर क्योंकि sudo -nसूडो में बग छोटी हो जाती है -V 1.7.9
मार्को एम। वॉन हेगन

1

@ Wags007 द्वारा दिए गए उत्तर को सरल बनाने के लिए

if sudo -n true
then
  sudo id
else
  echo "sorry, but did not want to bother you"
fi

हालाँकि, यदि आपके https://www.sudo.ws/man/1.8.15/sudoers.man.html कॉन्फ़िगरेशन में आपके पास defaults mail_badpassहर परीक्षा के लिए एक मेल भेजा जाएगा, जिसके परिणामस्वरूप परिणाम गलत होगा (प्रेरित होगा)। इस तरह के उपद्रव से बचने के लिए अपने sudoers फ़ाइल के उस हिस्से को बदल दें

Defaults       mail_badpass
Defaults!      /bin/true !mail_badpass

परिणामस्वरूप सुरक्षा चेतावनी मेल / बिन / सच को छोड़कर सभी आदेशों के लिए भेजे जाते हैं। ठीक है, किसी को अब sudo trueकिसी भी सुरक्षा चेतावनी मेल भेजे बिना असीमित संख्या में कॉल करके पासवर्ड को भंग करने की कोशिश कर सकता है ।

नोट: हमेशा visudosudoers फ़ाइल को संपादित करने के लिए अपने पसंदीदा संपादक के बजाय उपयोग करें। ऐसा करने में विफल रहने से आपको बाहर ताला लगने का खतरा है।


0

सुडो मैनुअल के अनुसार, सूडो सत्र समय स्टैम्प फ़ाइल ( /usr/lib/sudo/<username>) के अनुसार निर्धारित किया जाता है , इसलिए आप यह पता लगाने में सक्षम हो सकते हैं कि समय स्टैम्प फ़ाइल की तारीख / समय की जाँच करके कितना समय बचा है। हालाँकि, मेरे सिस्टम में, टाइम स्टैम्प फ़ाइल वास्तव में एक डायरेक्टरी है, और उनमें क्रिप्टिक सामग्री के साथ तीन फाइलें हैं (और कुछ अजीब समय टिकट भी हैं, लेकिन /usr/lib/sudo/<username>ऐसा लगता है कि टाइमस्टैम्प है जो उस समय के साथ मेल खाता है जब मैंने अपना पासवर्ड दिया था) मुझे लगता /usr/lib/sudo/<username>/0है कि सबसे हालिया sudoनिष्पादन का समय टिकट है ।


1
मेरे सिस्टम पर, टाइमस्टैम्प फाइलें एक निर्देशिका में हैं, जो कि sudo का उपयोग किए बिना नहीं पढ़ी जा सकती, जो पासवर्ड के लिए संकेत देती है और इस प्रकार ओपी की जरूरतों के लिए काम नहीं करेगी।
अगली सूचना तक रोक दिया गया।

अच्छी बात। मैंने इन फ़ाइलों के स्वामित्व की जाँच नहीं की। आप सही हैं, यह बेकार होगा।
डिसरस्टर


0

कम से कम सूडो 1.8.21p2 पर, यह दृष्टिकोण ठीक काम करता है:

if sudo -vn 2> /dev/null; then
    echo "You have an active sudo session"
fi

0

यह संभवतः अधिकांश लोगों के मानक द्वारा अत्यधिक ओवरकिल है, लेकिन यहां (पॉज़िक्ली सही) फ़ंक्शन है जो मैं यह जांचने के लिए उपयोग करता हूं कि sudoक्या अनलॉक किया गया है (उपयोगकर्ता द्वारा चलाए जाने पर फ़ंक्शन अपना समय बर्बाद नहीं करेगा root, क्योंकि अनलॉक करने की कोई आवश्यकता नहीं है sudo):

#!/bin/sh

_unlock_sudo() {
    if [ "$USER" != 'root' ]; then
        if ! sudo -n -- true 2>/dev/null; then
            printf '\n'
            printf 'Enter password for sudo user "%s":\n' "$USER"
            while ! sudo -- true; do
                printf '\n'
                while true; do
                    printf 'Slow your roll. Try to enter password again? [Y/n]: '
                    read -r answer
                    case "$answer" in
                        ''|y|Y|yes|Yes|YES)
                            printf '\n'
                            printf 'Enter password for sudo user "%s":\n' "$USER"
                            break
                            ;;
                        n|N|no|No|NO)
                            printf '\n'
                            printf 'OK. Exiting...\n'
                            exit 1
                            ;;
                        *)
                            printf 'Please enter a valid option...\n'
                            printf '\n'
                            ;;
                    esac
                done
            done
        fi
    fi
}

_unlock_sudo

-1

सरल उत्तर ...

sudo echo
isSudo=$?
if [[ "$isSudo" -ne 0 ]]; then
  echo "This script must be run by root or a sudo'er"
  echo
  exit 1
fi

# do stuff

exit 0

यह एक पासवर्ड के लिए संकेत देगा, अगर उपयोगकर्ता के पास पहले से ही सक्रिय sudo सत्र नहीं है
Slizzered

-2

कैसे आदमी पृष्ठ के बारे में

man sudo

अपने उपलब्ध आदेशों की सूची बनाएं:

sudo -l

sudo के पास स्वयं कोई समय या दिनांक सीमा नहीं है ... देखें:

man sudo
man sudoers

sudo -l मुझे एक पासवर्ड प्रॉम्प्ट देता है। मुझे यह बताने की आवश्यकता है कि मेरे पास कोई सक्रिय सूडो सत्र नहीं है।
वलदिल

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

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