SSH: sudo कमांड निष्पादित करें


44

मेरे पास एक इंटरेक्टिव शेल स्क्रिप्ट है, कि एक जगह पर दूसरी मशीन (उबंटू आधारित) के लिए ssh और रूट के रूप में कुछ निष्पादित करने की आवश्यकता है (उपयोगकर्ता को अपना पासवर्ड दर्ज करना चाहिए, लेकिन दूरस्थ कमांड को स्क्रिप्ट में नोट किया जाना चाहिए):

# ...
ssh remote-machine 'sudo ls'
# ...

हालाँकि, मुझे हमेशा यह त्रुटि संदेश वापस मिल जाता है:

sudo: no tty present and no askpass program specified

ठीक है, यह काफी स्पष्ट है। लेकिन मैं इसे कैसे दरकिनार कर सकता हूं? ऐसा कुछ होना चाहिए:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var

जवाबों:


52

चमत्कारिक sshहर चीज का इलाज है। बिंदु को -tएक छद्म ट्टी आवंटित करने के लिए ssh को मजबूर करने के लिए ध्वज जोड़ना है :

ssh -t remote-server 'sudo ls'

1
पीटीवाई हालांकि स्क्रिप्ट के साथ चीजों को गड़बड़ कर सकता है। lsउदाहरण के लिए आउटपुट में \ r \ n एंडिंग्स होंगे।
तोबू

1
आस-पास का आसान तरीका है कि गैर-टर्मिनल मोड में ls को बाध्य करना। ls | catकरेंगे - यह देखेंगे कि स्टडआउट एक पाइप है। इस विशिष्ट प्रश्न में, यह प्रासंगिक नहीं है, क्योंकि यह स्पष्ट रूप से एक टर्मिनल से अंतःक्रियात्मक रूप से चलाने का इरादा है - इसलिए आप शायद कॉलम और रंग और क्या चाहते हैं।
गाबे

0

यह विधि ssh के बाद sudo का उपयोग करके एक एकल स्क्रिप्ट चलाएगी:

मान लेते हैं कि हमारे पास sudo क्षमताओं वाला एक "दूरस्थ" उपयोगकर्ता है और हमारे पास एक स्क्रिप्ट है जिसे हम इसे रूट के रूप में निष्पादित करना चाहते हैं।

1) लॉगिन पर उपयोग करने के लिए एक स्क्रिप्ट / etc / passwd सेट करें :

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) "login.sh" के अंदर, हम उस स्क्रिप्ट को निष्पादित करते हैं जिसे हम "sudo" के रूप में चलाना चाहते हैं:

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

आम तौर पर यह पासवर्ड से दो बार पूछेगा: ssh login + sudo। यदि आप इसे केवल एक बार इनपुट करना चाहते हैं, तो पासवर्ड के बिना sudo आज़माएं (अनुशंसित नहीं)। <- कृपया बोल्डवेन टिप्पणी पढ़ें।

मुख्य लाभ यह है कि "ssh" को किसी अन्य पैरामीटर (as -t) की आवश्यकता नहीं होती है, और sudo सर्वर साइड पर मजबूर होता है। इसके अलावा, एक बार स्क्रिप्ट से बाहर निकलने के बाद, उपयोगकर्ता लॉग आउट हो जाता है।

यह उतना सुंदर नहीं हो सकता है, लेकिन यह सरल और काम करता है।


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

@ बोल्डवेन: हाँ, "पासवर्ड के बिना सुडोकू" सेट करने से सुरक्षा जोखिम है ... यह एक वैकल्पिक कदम है। मैं आपसे सहमत हूं, अगर SSH प्रमाणीकरण का फिर से उपयोग कर सकता है, तो इस तरह के "समाधान" की आवश्यकता नहीं होगी। आपके कमेंट के लिए धन्यवाद।
लेप

-1

आप बिना इंटरएक्टिविटी के रूट कमांड प्राप्त कर सकते हैं:

ssh server " sudo command" < sudopassword.txt

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