`Sudo find` कमांड में, मैं यह कैसे सुनिश्चित करूँ कि` -exec` कमांड को सामान्य उपयोगकर्ता के रूप में चलाया जाए?


10

मैं निम्नलिखित कमांड को इस तरह से बनाने की कोशिश कर रहा हूं कि process_pathsस्क्रिप्ट उन्नत विशेषाधिकार के तहत नहीं चल रही है। क्या इसे करने का कोई तरीका है?

sudo find /path/ -exec process_paths '{}' \+

यहां /path/कुछ फाइलें हैं जिनके पास सामान्य उपयोगकर्ता के लिए कोई पढ़ने की अनुमति नहीं है। स्क्रिप्ट को process_pathsसिर्फ रास्तों की जरूरत है।


... -exec sudo -u user process_paths {} \+
सातु कटुरा

@SatoKatsura कभी-कभी यह विफल रहता है sudo: unable to execute /usr/bin/perl: Argument list too long: /
pii_ke


2
यदि आप चाहते हैं कि -execकमांड्स को आपके उपयोगकर्ता के रूप में आमंत्रित किया जाए, तो आप पहली जगह findका उपयोग क्यों कर रहे हैं sudo?
मार्सेल

2
@marcelm मुझे लगता है कि प्रश्न का अंतिम वाक्य आपका उत्तर देता है।
अरे

जवाबों:


16

सिस्टम पर जो इसका समर्थन करते हैं (GNU और कुछ अन्य), आप कर सकते हैं:

sudo find /path/ -print0 | xargs -r0 process_paths

xargsके तहत नहीं चलाया जाता है sudo, इसलिए इसमें अभी भी मूल uids / gids हैं और मूल वातावरण (बड़े अर्थों में), इसके द्वारा संशोधित नहीं है sudo

process_pathsऊपर यद्यपि (के आधार पर संशोधित किया जा रहा समाप्त होता है stdin xargsकार्यान्वयन, उस पर खुला है /dev/nullया शेयरों pipeसे sudo/ find

इससे बचने के लिए (GNU xargsऔर गोले की तरह ksh, zshया bashउस समर्थन प्रक्रिया प्रतिस्थापन के साथ), आप कर सकते हैं:

xargs -r0a <(sudo find /path/ -print0) process_paths

के साथ zsh:

sudo zsh -c '
   files=(/path/**/*(D))
   USERNAME=$SUDO_USER
   autoload zargs
   zargs $files -- process_paths'

में zsh, करने के लिए एक उपयोगकर्ता नाम बताए $USERNAMEविशेष चर, जैसे उपयोगकर्ता डेटाबेस में इसी उपयोगकर्ता की है कि UID, GIDs सेट sudo -u "$SUDO_USER"करना होगा।

तुम यह कर सकते थे:

 sudo sh -c '
   exec find /path/ -exec sudo -u "$SUDO_USER" process_paths {} +'

लेकिन क्योंकि sudoएक $SUDO_COMMANDपर्यावरण चर (जिसमें रिक्त स्थान के साथ तर्कों का संघटन होता है) पास होता है process_paths, फाइलों की सूची दो बार पास हो process_pathsजाती है, जिसका अर्थ है कि args + env के अधिकतम आकार की सीमा तक पहुंचने की संभावना है यदि कोई बड़ा है फ़ाइलों की संख्या।

अधिकांश suकार्यान्वयन के साथ , आपको ऐसा करने में सक्षम होना चाहिए:

 sudo sh -c '
   exec find /path/ -exec su "$SUDO_USER" -c '\''
     exec "$0" "$@"'\'' process_paths {} +'

हालांकि suएक ही मुद्दा नहीं है।


1

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

sudo find <directory> -exec sudo -u <normal_user> <command> {} \;

लेकिन जैसा कि एक टिप्पणी में कहा गया है, यह स्पष्ट रूप से विफल हो सकता है अगर {} सूडो के लिए बहुत लंबा है।

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