बाश में एक साथ ssh और sudo का उपयोग कैसे करें?


10

मुझे ऐसा कोई प्रश्न नहीं मिला है जो इस विशिष्ट परिदृश्य का वर्णन करता हो।

मैं कई मशीनों से लॉगिंग को पुनः प्राप्त करने के लिए एक बहुत ही मूल bash स्क्रिप्ट निष्पादित करने की कोशिश कर रहा हूं। मैं स्क्रिप्ट को स्थानीय रूप से चला रहा हूं, लेकिन ssh के माध्यम से एक बाहरी मशीन को एक्सेस करने की आवश्यकता है, साथ ही उस पर एक विशेषाधिकार प्राप्त उपयोगकर्ता में sudo ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

इसे shx से चलाने से पता चलता है कि बैश 'ssh' लाइन पर अटक रहा है। इसलिए मैंने इसे संशोधित करने की कोशिश की:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

यह भी अनिश्चित काल के लिए स्टाल लगता है। क्या इस समस्या का बेहतर समाधान है ?? मुझे सूडो सु का उपयोग करने का कोई तरीका नहीं दिखता है जो मैं बता सकता हूं ...

किसी भी मदद के लिए धन्यवाद!


करीबी वोट क्यों? यह प्रश्न विषय पर है: सर्वर, वर्कस्टेशन, स्टोरेज या नेटवर्क के हार्डवेयर या सॉफ्टवेयर को प्रबंधित करना, इनका प्रबंधन, निगरानी या स्वचालित करने के लिए उपयोग किए जाने वाले उपकरण
jlliagre

जवाबों:


5

जिस तरह से मैं अपने वर्तमान परिवेश में इसे प्राप्त करता हूं, वह है -tझंडे के साथ ssh चलाना, जो कि आबंटन के लिए बाध्य करता है, और फिर इसके भीतर sudo -u रूट चलाना, निम्नानुसार है:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

सुदूर की ओर सूडरों में मेरा खाता है ताकि कोई पासवर्ड की आवश्यकता न हो।

यह उदाहरण आपको एक ही ssh सत्र के भीतर करने के लिए अलग-अलग तरीके दिखाता है, जिसमें bash के साथ कई कमांड चलाना या एक सबस्क्रिप्शन के भीतर शामिल है। ध्यान दें कि यदि आप उपरोक्त कोड को एक निष्पादन योग्य स्क्रिप्ट में रखते हैं, तो आप ssh को कमांड लाइन तर्क ($ 1 और $ 2) पास कर सकते हैं और इनका विस्तार किया जाएगा और फिर दूरस्थ पक्ष में संदर्भित किया जाएगा।


दुर्भाग्य से क्योंकि मैं दूरस्थ सर्वर का प्रबंधन नहीं करता हूं , मेरा मानना ​​है कि मैं यहां sudo su का उपयोग कर रहा हूं। क्या यह अभी भी इस प्रारूप में काम करेगा?
मत्ती १२४२३४

हाँ, यह भी काम करेगा। संकेत मिलने पर आप पासवर्ड दर्ज कर सकते हैं।
माइकल मार्टिनेज

मैंने कोशिश की है: ssh -t mrhyner@stg-app3.indeed.net << EOF sudo su - adcentrl egrep 'ERROR \ | WARN' / घर / adcentrl / cronjobs / लॉग / * / * EOF लेकिन मैंने प्राप्त किया: "Pseudo -टर्मिनल का आवंटन नहीं किया जाएगा क्योंकि स्टड टर्मिनल नहीं है। "
23:12 पर Matt124234

पूरी तरह से ठीक है। उस चेतावनी को अनदेखा करें और आगे बढ़ें। यदि आप चाहते हैं कि आप दूरस्थ समय पर "etcTty" को / etc / sudoers में अक्षम कर सकें
माइकल मार्टिनेज

5

यदि आप नहीं चाहते हैं या आप पासवर्ड पूछने से सूडो को रोक नहीं सकते हैं, तो एक सरल चाल यह है कि इसे स्थानीय रूप से पढ़ें और इसे स्थानीय चर में संग्रहीत करें:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF

1

अगर पासवर्ड रहित कमांड की अनुमति देने के लिए sudo कॉन्फ़िगर किया गया है, तो आपको वही करना चाहिए जो आप चाहते हैं:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

या

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

इस पर निर्भर करता है कि आप file.txtफ़ाइल स्थानीय रूप से बनाना चाहते हैं या दूरस्थ रूप से।

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

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"

बहुत ही रोचक। हालाँकि ssh के बिना -t का उपयोग करना मुझे "नो ट्टी प्रेजेंट" बताता है। -T जोड़ने से यह त्रुटि दूर हो जाती है लेकिन यह 'sudo su' का सम्मान नहीं करता है क्योंकि यह मुझे पासवर्ड के लिए संकेत देता है। यहाँ विशेष रूप से मैं क्या कर रहा हूँ: ssh -t mrhyner@test-server.net "sudo su - adcentrl -c egrep" ERROR \ | WARN "/ home / adcentrl / cronjobs / लॉग / * / *" यह मुझे देता है: bash : WARN: कमांड नहीं मिला [sudo] mrhyner के लिए पासवर्ड:
Matt124234

क्षमा करें, मुझे स्पष्ट रूप से पता नहीं है कि इस टिप्पणी में मेरी टिप्पणियों को कैसे प्रारूपित किया
जाए

मैं मान रहा था कि सूडो को आपके दूरस्थ खाते के लिए पासवर्ड रहित होने के लिए कॉन्फ़िगर किया गया था।
jlliagre

और आपको अतिरिक्त एकल उद्धरण याद आ रहे हैं।
jlliagre

यह है, जो मुझे कारण है कि मार किसी कारण के लिए ssh आदेश का सम्मान नहीं है। यह ऐसा काम कर रहा है जैसे मैं अपने स्थानीय होस्ट = \
मैट 124234
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.