क्या कोई कार्यक्रम बता सकता है कि यह सूडो के तहत चलाया जा रहा है?


27

मेरे पास एक कार्यक्रम है जो "सुडो" के तहत चलाया जा रहा है, तो अलग तरह से व्यवहार करना चाहिए। वहाँ एक तरह से यह पता लगा सकता है कि क्या यह सूडो के तहत चलाया गया था?

अपडेट: किसी ने पूछा कि मैं ऐसा क्यों करना चाहता हूं। इस स्थिति में, MacPorts का उपयोग करने वाले मैक पर आउटपुट होता है जो आपको एक विशेष कमांड को कट-एंड-पेस्ट करने के लिए कहता है। यदि MacPorts कमांड "sudo" के साथ चलाया गया था, तो इसमें नमूना कमांड में sudo शामिल होना चाहिए:

$ sudo port selfupdate 
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead.  It would be even better if it just did it for you :-)

मैं उत्सुक हूं: क्या आप बता सकते हैं कि इसे अलग तरह से कैसे व्यवहार करना चाहिए?
Sciurus

1
@sciurus आमतौर पर सामान्य उपयोग-मामला एक स्थापित स्क्रिप्ट में होता है जिसे रूट विशेषाधिकारों की आवश्यकता होती है; यदि आपके पास नहीं है तो बस तुरंत मर जाते हैं।
निक टी

3
ऐसा लगता है जैसे meta.stackexchange.com/questions/66377/what-is-the-xy-problem/… । यह आप वास्तव में क्या करना चाहते हैं?
जेनी डी का कहना है कि

मुझे कुछ याद है कि कुछ कमांड के बारे में पता है कि यह रूट के रूप में चलाया जाता है या नहीं ... मुझे लगता है कि इसका उत्तर "हां" है
रॉल्फ

जवाबों:


48

हाँ, वहाँ 4 पर्यावरण चर सेट कर रहे हैं जब एक कार्यक्रम sudo के तहत चल रहा है:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

ध्यान दें कि इन्हें बस सेट करके फेक किया जा सकता है। किसी भी महत्वपूर्ण चीज के लिए उन पर भरोसा न करें।

उदाहरण के लिए: इस कार्यक्रम में हमें उपयोगकर्ता को कुछ अन्य कार्यक्रम चलाने के लिए कहना होगा। यदि वर्तमान एक सूडो के साथ चलाया गया था, तो दूसरा भी होगा।

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

ध्यान दें कि यह केवल एक SUDO_ * चर के लिए परीक्षण करता है यदि यह पहली बार साबित कर सकता है कि यह रूट के रूप में चल रहा है। तब भी यह केवल कुछ उपयोगी पाठ को बदलने के लिए इसका उपयोग करता है।


2
मैं "कुछ भी महत्वपूर्ण" के लिए क्या उपयोग करूंगा?
केविन -

3
@ केविन अगर कोई अपने वातावरण के साथ खिलवाड़ करता है तो वह विशेषाधिकारों पर नकली है, तो वे उम्मीद करते हैं कि वे जानते हैं कि वे क्या कर रहे हैं और परिणाम स्वीकार करेंगे।
निक टी

नीच क्योंकि किसी भी जवाब के लिए योग्य होने के लिए "उन पर किसी भी चीज़ के लिए भरोसा नहीं करना चाहिए" सभी का जवाब नहीं है, लेकिन एक बदसूरत हैक।
स्टीफन सी

यह उस प्रश्न का पूरी तरह स्वीकार्य उत्तर है जो पूछा गया था। लोगों को यह चेतावनी देने की जरूरत है कि वे सूडो के इस्तेमाल को रोकने की कोशिश कर सकते हैं , बजाय इसके कि इसका पता लगाया जाए। उपयोगकर्ता द्वारा चलाए जा सकने वाले आदेशों को सीमित करने के लिए sudo के कमांड उपनामों का उपयोग करके रोकथाम की जानी चाहिए।
dwurf

11

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

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

यदि आप यह जानना चाहते हैं कि क्या आपके पास किसी ऑपरेशन को करने के लिए अनुमतियाँ हैं, तो इसका सबसे अच्छा तरीका यह है कि आमतौर पर बस कोशिश करें और इसे करें और फिर अनुमतियों के मुद्दों के लिए इरनो की जाँच करें कि क्या यह विफल रहता है या यदि यह एक मल्टी स्टेज ऑपरेशन है जो या तो सभी विफल या सभी सफल होना चाहिए आप जांच सकते हैं कि क्या कोई ऑपरेशन POSIX पहुंच फ़ंक्शन जैसे कार्यों के साथ काम करेगा (यदि संभावित रूप से अनुमतियों को बदला जा रहा है तो यहां संभावित दौड़ की स्थिति से सावधान रहें)

अगर इसके अलावा आपको सूडो के पीछे के वास्तविक उपयोगकर्ता को जानने की जरूरत है तो आप गेटलॉइन फ़ंक्शन का उपयोग कर सकते हैं जो कि अंतर्निहित टर्मिनल के साथ किसी भी इंटरैक्टिव सत्र के लिए काम करना चाहिए और आपको उदाहरण के लिए यह पता लगाने की अनुमति देगा कि ऑडिट करने के लिए कमांड कौन चला रहा है या वास्तव में है। लॉग्स को बचाने के लिए वास्तविक उपयोगकर्ता की होम निर्देशिका।

अंत में यदि आप वास्तव में क्या चाहते हैं तो यह पता करें कि क्या किसी उपयोगकर्ता की रूट एक्सेस है (फिर भी एक बुरा विचार लेकिन कम कार्यान्वयन विशिष्ट) आप 0 के यूआईडी और इस प्रकार रूट के लिए जांच करने के लिए गेट्यूइड का उपयोग कर सकते हैं ।


7

दो तंत्र हैं जिनका उपयोग किया जा सकता है।

  • पर्यावरण चर की जाँच करना किसी भी तरह से नकली हो सकता है, लेकिन ऐसा करना सबसे आसान है। growisofsSUDO के तहत भागना पसंद नहीं है, इसलिए मैं SUDO चर को स्क्रिप्ट में अनसेट करता हूं जहां मैं इसका उपयोग करता हूं। इसे दूसरे तरीके से फेक किया जा सकता है। (SUDO वैरिएबल को एट और बैच कमांड के तहत चलाए जाने वाले स्क्रिप्ट के लिए पर्यावरण में भी ले जाया जाता है।)
  • यह देखने का एक और तरीका है कि क्या आप सूडो के तहत चल रहे हैं, अपने माता-पिता की प्रक्रिया से लेकर सुडो की तलाश तक की प्रक्रिया की सूची पर चलना है। यह छिपाना मुश्किल होगा कि आप सूडो के नीचे इस तरह से दौड़ रहे थे, लेकिन यह अधिक जटिल है। यह अब भी संभव है कि आप सूडो के तहत भाग रहे हों।

यह जांचना अधिक आम है कि क्या आप उपयुक्त उपयोगकर्ता के रूप में चल रहे हैं। ऐसा करने के लिए idकमांड का उपयोग किया जा सकता है। अगले आदेश को चलाने के लिए आवश्यक हो सकता है idयह निर्धारित करने के लिए टॉमऑन टाइम की स्क्रिप्ट कमांड का उपयोग करती है sudo


1
> यह छिपाना मुश्किल होगा कि आप सूडो के तहत इस तरह से चल रहे थे कि क्या आप sudoबाइनरी का नाम बदलकर कुछ और नहीं कर सकते? या sudoविपरीत करने के लिए कुछ अन्य निष्पादन योग्य नाम ? ऐसा नहीं है कि मैं वास्तव में किसी को समझदार होने की उम्मीद करूँगा ...
बॉब

@ याकूब rootको sudoनिष्पादन योग्य का नाम बदलने की आवश्यकता होगी । एक सामान्य उपयोगकर्ता ऐसा करने में सक्षम नहीं होगा। मैंने ध्यान दिया कि आप नकली हो सकते हैं जो आपके तहत चल रहा है sudo। मौजूदा प्रोग्राम का नाम बदलने से काम चल जाएगा। एक समर्पित नकली sudoकार्यक्रम के लिए आवश्यक कोड तुच्छ है।
बिलथोर

तुम बस कहीं से sudo बाइनरी डाउनलोड कर सकते हैं और इसे सही अनुमति दे सकते हैं ...
Jens Timmerman

@JensTimmerman आपको इसे सही अनुमति देने के लिए रूट एक्सेस की आवश्यकता है। यदि आप इसका नाम बदल सकते हैं या कड़ी कर सकते हैं। इसे डाउनलोड करने की आवश्यकता नहीं है। यदि आप इसे SUID को लक्षित उपयोगकर्ता आईडी में स्थापित करते हैं (यदि वह इस तरह काम करेगा), तो आपको लक्ष्य उपयोगकर्ता आईडी से पहले ही समझौता करना होगा।
बिलचोर

आह, ठीक है, यह सेतु के बिना काम करने से इनकार करता है, मेरा बुरा ...
जेन्स टिम्मरमैन

2

आप प्रभावी बनाम वास्तविक उपयोगकर्ता आईडी की तुलना कर सकते हैं।

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


2
नहीं, sudoदोनों प्रभावी और वास्तविक आईडी सेट करता है। जैसा कि मुकदमा करने का विरोध किया, जो नहीं करता है। यहाँ एक तुच्छ सी कार्यक्रम है जिसका उपयोग आप परीक्षण करने के लिए कर सकते हैं (क्षमा करें, टिप्पणी नई टिप्पणियाँ निकाल देगी, आपको उन्हें वापस जोड़ना होगा):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
derobert

... या, वैकल्पिकperl -E 'say $<, "\n", $>'
derobert

2

आप निम्न प्रकार से प्रभावी यूआईडी (ईयूआईडी) चर की जांच कर सकते हैं:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi

इस सवाल का जवाब नहीं है। जब कोड sudo के रूप में चलता है तो रूट रन के रूप में रन करता है।
स्टीफन सी

@StephenC - मुझे लगता है कि ओपी के उद्देश्यों के लिए, कोई अंतर नहीं है। IMHO उनका लक्ष्य भेद के बिना एक प्रामाणिक मूल खोल से sudo निष्पादन या निष्पादन की पहचान करना है।
एलिरन मलका

1
मुझे लगता है आप सही होंगे। मैं यहाँ आया था क्योंकि मुझे समझ नहीं आया कि sudo echo $USERअनपेक्षित उपयोगकर्ता नाम को क्यों प्रिंट करता है (चर को सुडो से पहले प्रतिस्थापित किया जाता है)। मैंने वास्तव में अपनी स्क्रिप्ट में आपके कोड का उपयोग किया है। धन्यवाद!
स्टीफन सी

सबसे अधिक स्वागत :)
एलिरन मलका

-1

आप किसी फ़ाइल को अंदर /rootऔर फिर if -eउसे छू सकते हैं । और अगर, यह सच है, rm(त्रुटि कोड की जाँच) तो यह आपकी परीक्षा अगली बार काम करती है।

Rm के बाद एरर कोड (या रिटर्न कोड) की जाँच करना किसी को आपके द्वारा शरारत खेलने के लिए फ़ाइल बनाने के लिए sudo शक्तियों का उपयोग करने से रोकता है।


4
यह उत्तर जांचता है कि क्या प्रक्रिया को लिखने की अनुमति है /root(जो कि यूआईडी 0 के रूप में चलने के रूप में आवश्यक नहीं है), लेकिन यह जांच नहीं करता है कि क्या यह उन अनुमतियों का उपयोग करके प्राप्त हुआ है sudo
लददादा

हां, "एक बिल्ली की त्वचा के हजार तरीके"; जैसा कि मैंने उत्तर लिखा था, मैंने अन्य 4 या 5 चीजों के बारे में सोचा, इसलिए मैंने इसे लपेट लिया।
क्रिस के

-2

मैंने पाया कि यह इसके लिए अच्छा काम करता है

[ $(cat /proc/$PPID/loginuid) -ne 0 ] && [ "$USER" == "root" ]

यह तब काम नहीं करता जब मैं इसे FreeBSD, Centos7, या MacOS X पर आज़माता हूं। मुझे लगता है कि आपको "/ etc" के बजाय "/ proc" से मतलब है। लेकिन उस बदलाव के साथ भी, यह उन तीनों में से किसी पर भी काम नहीं करता है। "$ USER" sudo द्वारा रीसेट किया गया है। क्या आपका मतलब $ SUDO_USER से है? इसके अलावा, क्या आपका मतलब "" ["के बजाय" ["है?
टॉमऑनटाइम

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