सु विकल्प - दूसरे उपयोगकर्ता के रूप में कमांड चलाना


75

मैं सोच रहा था कि एक स्क्रिप्ट से दूसरे उपयोगकर्ता के रूप में कमांड कैसे चलाया जाए।

मेरे पास स्क्रिप्ट का स्वामी रूट के रूप में सेट है। मेरे पास हडसन उपयोगकर्ता के रूप में कमांड चलाने के लिए स्क्रिप्ट के भीतर निम्नलिखित कमांड भी है:

su -c command hudson

क्या यह सही वाक्यविन्यास है?


अन्य googler के लिए: कुछ उपयोगकर्ताओं की यह क्षमता उद्देश्य पर अक्षम हो सकती है। आप दौड़ सकते हैं sudo cat /etc/passwd | grep user-abc। यदि आप ऐसा कुछ देखते हैं: user-abc:x:994:994::/home/user-abc:/bin/falseतो यह काम नहीं करेगा। ऐसा इसलिए है क्योंकि अंतिम भाग " /bin/false" का अर्थ है कि उस उपयोगकर्ता के लिए कोई शेल नहीं है।
अलेक्जेंडर बर्ड

जवाबों:


78

हाँ। यहाँ है --help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

और कुछ परीक्षण (मैं खाते के sudoलिए पासवर्ड नहीं जानता के रूप में इस्तेमाल किया nobody)

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

जब आपका आदेश तर्क देता है तो आपको इसे उद्धृत करने की आवश्यकता होती है। यदि आप नहीं करते हैं, तो अजीब चीजें घटित होंगी। मैं यहाँ हूँ - रूट - पूर्ण कमांड को उद्धृत किए बिना / होम / ओली (ओली के रूप में) में एक निर्देशिका बनाने की कोशिश कर रहा हूँ :

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

इसे केवल ध्वज mkdirके मान के रूप में पढ़ा जाता है -cऔर यह /home/oli/javaउपयोगकर्ता नाम के रूप में उपयोग करने का प्रयास कर रहा है । यदि हम इसे उद्धृत करते हैं, तो यह काम करता है:

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -

52

नोट: "मेरे पास स्क्रिप्ट के मालिक को रूट के रूप में सेट किया गया है" कुछ भी नहीं करता है; अगर आपके पास सेटिउड बिट सेट है तो भी यह काम नहीं करता है


यह मानते हुए कि आप वास्तव में स्क्रिप्ट को रूट के रूप में चला रहे हैं, हालांकि, आप उपयोग कर सकते हैं sudosuमुख्य रूप से उपयोगकर्ताओं को बदलने के लिए है, जबकि sudoअन्य उपयोगकर्ताओं के रूप में कमांड निष्पादित करने के लिए है। -uध्वज आप जो उपयोगकर्ता आदेश के रूप में निष्पादित करने के लिए निर्दिष्ट कर सकते हैं:

sudo -u hudson command

1
कई बार मैंने सामना किया है (सिस्टम पर जहां सूडों को अच्छी तरह से प्रशासित किया गया है) जो sudoआपको उपयोग करने की कोशिश कर रहा है, बस इसे प्राप्त कर सकते हैं root is not in the sudoers file:। जो su - <username> -c "command to run"एकमात्र विकल्प बनाता है।
RAM237

गैर-तुच्छ आदेश को निष्पादित करते समय उद्धरणों की आवश्यकता नहीं होती है। (जैसे, sudo -u kilgore mv this that)
२३:१०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.