कैसे sudo में दो कमांड चलाने के लिए?


152

क्या कोई तरीका है कि मैं कमांड लाइन से दो डीबी 2 कमांड कैसे चला सकता हूं? (उन्हें PHP execकमांड से बुलाया जाएगा ।)

  1. db2 connect to ttt (ध्यान दें कि हमें दूसरी कमांड के लिए कनेक्शन लाइव होना चाहिए
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

मैंने यह कोशिश की:

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

पहला कमांड सही तरीके से खत्म होता है लेकिन दूसरा त्रुटि संदेश के साथ विफल हो जाता है SQL1024N A database connection does not exist. SQLSTATE=08003

ध्यान दें कि मुझे इसे php उपयोगकर्ता के रूप में चलाने की आवश्यकता है। Php उपयोगकर्ता के sudo -u db2inst1 idरूप में कमांड मुझे सही आउटपुट देता है।


कृपया टिप्पणी छोड़ें कि आप इस प्रश्न को बंद क्यों करना चाहते हैं। धन्यवाद।
राडेक

1
करीबी वोट सर्वरफोल में प्रवास के लिए है, क्योंकि यह एक सिस्टम एडमिनिस्ट्रेशन प्रश्न है, प्रोग्रामिंग नहीं।
बोन्डलन

जवाबों:


157

उदाहरण के लिए sudo शेल के माध्यम से कई कमांड चला सकता है:

$ सूदो -s - 'whoami; मैं कौन हूँ'
जड़
जड़

आपकी आज्ञा कुछ इस तरह होगी:

sudo -u db2inst1 -s - "db2 कनेक्ट टू टेट; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'"

यदि आपका sudo वर्जन अर्धविराम के साथ -s के साथ काम नहीं करता है (जाहिरा तौर पर, यह कुछ विकल्पों के साथ संकलित नहीं होता है), तो आप उपयोग कर सकते हैं

सुडो - श-c ’ओयामी; मैं कौन हूँ'

इसके बजाय, जो मूल रूप से एक ही काम करता है लेकिन आपको शेल का नाम स्पष्ट रूप से बताता है।


12
यह नवीनतम डेबियन स्टेबल (निचोड़) बैश पर काम नहीं करता है:sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
Valor

11
@Valor का उपयोग आप sudo -- sh -c 'whoami; whoami;वर्कअराउंड के रूप में कर सकते हैं जब "sudo -s" टूट जाता है। मैंने जवाब भी अपडेट कर दिया है।
wjl

6
संपादित संस्करण के लिए +1 जो "- श-सी" उदाहरण दिखाता है। धन्यवाद!
जद।

4
क्या आप कृपया समझा सकते हैं कि आपको "-" की आवश्यकता क्यों है?
विक सीडवेल्यू

7
@VicSeedoubleyew --मापदंडों के अंत को इंगित करता है sudo, इसलिए बाकी सब कुछ कमांड का हिस्सा है; इसके बिना, तर्क की तरह तर्क के -cरूप में व्याख्या की जा सकती है sudo। यह अधिकांश (लेकिन सभी नहीं) कमांड-लाइन कार्यक्रमों के लिए काम करता है। एक और (गैर- sudo) उदाहरण के लिए, एक फ़ाइल को हटाने के लिए जिसे -fआप बस नहीं चला सकते हैं rm -f, ठीक है ?! लेकिन आप rm -- -fनामक फ़ाइल को हटाने के लिए चला सकते हैं -f
wjl

176

अपने आदेश के लिए आप निम्नलिखित उदाहरण भी देख सकते हैं:

sudo sh -c 'whoami; whoami'


14
मुझे यह अधिक विश्वसनीय विकल्प लगा है।
निक


42

यदि आप उद्धरणों को संभालना चाहते हैं:

sudo -s -- <<EOF
id
pwd
echo "Done."
EOF

4
यह यहां का सबसे साफ जवाब है, धन्यवाद। हो सकता है कि एक नोट जोड़ें "आप कई कमांड नहीं चला सकते हैं sudo- आपको हमेशा इसे एक शेल को निष्पादित करने में ट्रिक करना होगा जो कई कमांड को पैरामीटर के रूप में चलाने के लिए स्वीकार कर सकता है"
trs

8

एक evalउपखंड के उपयोग से बचने के लिए एक वैकल्पिक विकल्प :

sudo -s eval 'whoami; whoami'

नोट: अन्य उत्तर sudo -sविफल होने का उपयोग कर रहे हैं क्योंकि उद्धरण को कोसने के लिए पारित किया जा रहा है और एक ही आदेश के रूप में चलाया जा रहा है ताकि उद्धरण को निष्कासित करने की आवश्यकता हो। evalबेहतर बताया गया है कि यह एसओ उत्तर है

आदेशों के भीतर उद्धृत करना और भी आसान है:

$ sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;

और अगर आज्ञाओं को चलने से रोकने की जरूरत है अगर कोई अर्ध-कॉलोन के बजाय डबल-एम्परसेंड का उपयोग नहीं करता है:

$ sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found

3

-sविकल्प मेरे लिए काम नहीं किया, -iकिया था।

यहाँ एक उदाहरण है कि मैं अपने बैश से लॉग साइज़ को कैसे अपडेट कर सकता हूँ:

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;'

1

टर्मिनल पर, टाइप करें:

$ sudo bash

फिर जितने चाहें उतने कमांड लिखें। टाइप करें exitआपका कार्य पूर्ण।

यदि आपको इसे स्वचालित करने की आवश्यकता है, तो एक script.shफ़ाइल बनाएं और उसे चलाएं:

$ sudo ./script.sh

1

थोड़ा संबंधित विषय पर, मैं एसएसएच के माध्यम से एक ही मल्टी-कमांड सूडो करना चाहता था, लेकिन उपरोक्त में से कोई भी काम नहीं किया।

उबंटू पर उदाहरण के लिए,

$ ssh host.name sudo sh -c "whoami; whoami"
[sudo] password for ubuntu:
root
ubuntu

यहां खोजा गया ट्रिक कमांड को डबल-कोट करना है।

$ ssh host.name sudo sh -c '"whoami; whoami"'
[sudo] password for ubuntu:
root
root

अन्य विकल्प जो भी काम करते हैं:

ssh host.name sudo sh -c "\"whoami; whoami\""
ssh host.name 'sudo sh -c "whoami; whoami"'

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


1

यदि आप रूट पासवर्ड जानते हैं, तो आप कोशिश कर सकते हैं

su -c "<command1> ; <command2>"  

यदि आप रूट पासवर्ड नहीं जानते हैं, तो उपयोग करें sudo su -c "<command1> ; <command2>"
डेग होइदहल

0

उपरोक्त उत्तर आपको उद्धरण के अंदर उद्धरण नहीं करने देंगे। यह समाधान होगा:

sudo -su nobody umask 0000 \; mkdir -p "$targetdir"

Umask कमांड और mkdir-कमांड दोनों 'कोई नहीं' उपयोगकर्ता के साथ चलता है।


आप सिंगल और डबल कोट्स का उपयोग कर सकते हैं और उनसे बच सकते हैं।
राडेक

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