ssh पर sudo करने का उचित तरीका


150

मेरे पास एक स्क्रिप्ट है जो सुडो का उपयोग कर एक दूरस्थ सर्वर पर SSH के माध्यम से एक और स्क्रिप्ट चलाती है। हालाँकि, जब मैं पासवर्ड टाइप करता हूं, तो यह टर्मिनल पर दिखाई देता है। (अन्यथा यह ठीक काम करता है)

ssh user@server "sudo script"

ऐसा करने का उचित तरीका क्या है, इसलिए मैं SSH पर sudo के लिए पासवर्ड टाइप कर सकता हूं, बिना पासवर्ड के मैं टाइप नहीं कर सकता?


2
मेरे लिए के रूप में, ssh के माध्यम से sudoing का एक तरीका देखने के लिए कारण था कि यह काम नहीं कर रहा था, जब की तरह कुछ की कोशिश कर रहा ssh <user@server> sudo <script>, जैसा कि मैंने त्रुटि हो रही थीsudo: no tty present and no askpass program specified
knocte

जवाबों:


244

दूसरा तरीका -tस्विच का उपयोग करना है ssh:

ssh -t user@server "sudo script"

देखें man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
अच्छा, मैं -t विकल्प के बारे में जानता था, बस यह नहीं जानता था कि यह सूदो संकेतों के लिए काम करता है।

3
के लिए -t विकल्प क्या है?
विंस


3
यह यहां काम नहीं कर रहा है: ssh -t localhost <<< "sudo touch file;"EDIT जाहिर है यह महत्वपूर्ण है कि आप वास्तव में कमांड को एक पैरामीटर के रूप में प्रदान करते हैं, न कि मानक के माध्यम से (जो दृष्टि में समझ में आता है)।
सीमित प्रायश्चित

-tविधि को भी जो सामान्य रूप से ऐसा करने के आदेशों की रंग का उत्पादन दिखाएगा।
कर्मकाज़े

24

मैं निम्नलिखित कमांड के साथ इसे पूरी तरह से स्वचालित करने में सक्षम था:

echo pass | ssh -tt user@server "sudo script"

लाभ:

  • कोई पासवर्ड संकेत नहीं
  • रिमोट मशीन बैश इतिहास में पासवर्ड नहीं दिखाएंगे

सुरक्षा के बारे में: जैसा कि कर्ट ने कहा, इस कमांड को चलाने से आपका पासवर्ड आपके लोकल बैश हिस्ट्री पर दिखाई देगा, और बेहतर होगा कि पासवर्ड को किसी अलग फाइल में सेव करें या सभी कमांड को .sh फाइल में सेव करें और उस पर अमल करें। नोट: फ़ाइल को सही अनुमति की आवश्यकता है ताकि केवल अनुमत उपयोगकर्ता ही इसे एक्सेस कर सकें।


8
यह पासवर्ड सहित स्थानीय सिस्टम के बैश इतिहास पर दिखाई देगा। बेहतर है कि पासवर्ड को फाइल में स्टोर करें और फाइल को कैट करें।
कर्ट फिट्ज़नर

4
यार, मैं जानता था -t, लेकिन मैंने मैनुअल को ध्यान से नहीं पढ़ा था कि आप इसे दो बार पास कर सकते हैं! यह वही है जो मैं महीनों से देख रहा हूँ ! एक सुरक्षा जोड़ के रूप में, मैंने बस चलाने से पहले एक पासवर्ड चर निर्धारित किया read -s -p "Password: " pw, फिर किया echo "$pw" | ....। मैंने अब इसे अपने लिए एक आसान स्क्रिप्ट में रोल कर लिया है :)।
22

मेरे लिए आकर्षण की तरह काम किया!
MiKr13

जो भी विशिष्ट उपयोगकर्ता और कमांड आपको चलाने की आवश्यकता है, उसके लिए आप सिर्फ पासवर्ड रहित sudo क्यों सेट नहीं करते हैं? यह एक SSH समस्या नहीं है ...
nomen

@ अपने समाधान भी मान्य है, लेकिन अतिरिक्त कदम की आवश्यकता है। यदि मेरे पास बिना पासवर्ड वाले सूडो उपयोगकर्ता के बहुत सारे उपकरण हैं, तो मैं इस समाधान का उपयोग करके एक स्वचालन स्क्रिप्ट बना सकता हूं। कभी-कभी आप एक ऐसी प्रणाली पर काम करते हैं जो आपके पास नहीं है और आप नहीं चाहते हैं या परिवर्तन नहीं कर सकते हैं, कभी-कभी अन्य विचार भी होते हैं।
ofirule

6

मान लें कि आप कोई पासवर्ड नहीं चाहते हैं :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

उदाहरण

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
यह / / बहुत / खतरनाक है क्योंकि प्लेनटेक्स्ट पासवर्ड कमांड लाइन पर समाप्त होता है। कमांड लाइनें सार्वजनिक हैं और सिस्टम पर हर दूसरे उपयोगकर्ता और प्रक्रिया द्वारा देखी जा सकती हैं। उदाहरण के लिए, एक अनपेक्षित उपयोगकर्ता द्वारा "ps auxwwwww" हर प्रक्रिया को चलाने और कमांड लाइनों को दिखाएगा जो उन्हें चलाता था।
कर्ट फिट्ज़नर

3
अपने पासवर्ड (प्लेनटेक्स्ट में) को bash_history फ़ाइल में डालने का उल्लेख नहीं करें।
Layne Bernardo

4

एक पासवर्ड पास करने में एसएसएच से अधिक, कोई आवश्यक नहीं है:

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

उदाहरण 1 - सरल रिमोट कमांड

इस उदाहरण में, हम एक साधारण whoamiआदेश भेजते हैं :

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

हम sudo को प्रॉम्प्ट जारी नहीं करने और स्टड से इसका इनपुट लेने के लिए कह रहे हैं। यह sudo पासवर्ड को पूरी तरह से साइलेंट करता है इसलिए केवल जो प्रतिक्रिया आपको मिलती है वह आउटपुट से है whoami

इस तकनीक से आपको ssho ssh के माध्यम से प्रोग्राम चलाने की अनुमति देने का लाभ है कि खुद को स्टड इनपुट की आवश्यकता होती है। ऐसा इसलिए है क्योंकि स्टड की पहली पंक्ति पर sudo पासवर्ड का उपभोग कर रहा है, फिर जो भी प्रोग्राम चलता है वह स्टड को पकड़ना जारी रखता है।

उदाहरण 2 - रिमोट कमांड जिसके लिए अपने स्वयं के स्टड की आवश्यकता होती है

निम्नलिखित उदाहरण में, रिमोट कमांड "कैट" को सुडो के माध्यम से निष्पादित किया जाता है, और हम रिमोट कैट के लिए स्टड के माध्यम से कुछ अतिरिक्त लाइनें प्रदर्शित करने के लिए प्रदान कर रहे हैं।

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

आउटपुट दर्शाता है कि <remote_sudo_password> लाइन सूडो द्वारा खपत की जा रही है, और यह कि दूरस्थ रूप से निष्पादित बिल्ली फिर अतिरिक्त लाइनों को प्रदर्शित कर रही है।

यह कहाँ फायदेमंद होगा इसका एक उदाहरण है यदि आप कमांड लाइन का उपयोग किए बिना किसी विशेषाधिकार प्राप्त कमांड को पासवर्ड पास करने के लिए ssh का उपयोग करना चाहते हैं। कहो, यदि आप ssh पर एक दूरस्थ एन्क्रिप्टेड कंटेनर माउंट करना चाहते हैं।

उदाहरण 3 - एक रिमोट वेराक्रिप्ट कंटेनर को माउंट करना

इस उदाहरण की लिपि में, हम सुदूर के माध्यम से वेरा क्रिप्टक कंटेनर को बिना किसी अतिरिक्त संकेत के पाठ के साथ बढ़ते हुए देख रहे हैं:

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

यह ध्यान दिया जाना चाहिए कि ऊपर दिए गए सभी कमांड-लाइन उदाहरणों में (स्क्रिप्ट को छोड़कर) << EOFकमांड लाइन पर निर्माण, स्थानीय मशीन के .bash_history में दर्ज किए जाने वाले पासवर्ड सहित सब कुछ टाइप कर देगा। इसलिए यह अत्यधिक अनुशंसित है कि वास्तविक दुनिया के उपयोग के लिए आप या तो इसका उपयोग पूरी तरह से एक स्क्रिप्ट के माध्यम से करते हैं, जैसे कि ऊपर दिए गए veracrypt उदाहरण के लिए, या, यदि कमांड लाइन पर है तो पासवर्ड को एक फ़ाइल में डालें और उस फ़ाइल को ssh के माध्यम से रीडायरेक्ट करें।

उदाहरण 1 ए - उदाहरण 1 स्थानीय कमांड-लाइन पासवर्ड के बिना

इस तरह पहला उदाहरण बनेगा:

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

उदाहरण 2a - उदाहरण 2 स्थानीय कमांड-लाइन पासवर्ड के बिना

और दूसरा उदाहरण बन जाएगा:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

यदि आप अपने इतिहास में लिपियों की सामग्री समाप्त नहीं करते हैं, तो पासवर्ड को एक अलग फ़ाइल में डालना अनावश्यक है यदि आप एक स्क्रिप्ट में पूरी चीज़ डाल रहे हैं। यह अभी भी उपयोगी हो सकता है, हालांकि, यदि आप उन उपयोगकर्ताओं को अनुमति देना चाहते हैं जिन्हें स्क्रिप्ट को निष्पादित करने के लिए पासवर्ड नहीं देखना चाहिए।


Ssh रिमोट कमांड में, आपको catsudo में परिणामों को निष्पादित और पाइप करने की आवश्यकता क्यों है ? क्या आप sudoमुख्य ssh रिमोट कमांड के रूप में उपयोग कर सकते हैं ?
जोनापॉ

@joanpau प्रारंभिक catका उपयोग उपयोगकर्ता के पासवर्ड को दूसरी तरफ sudo के माध्यम से पाइप करने के लिए किया जाता है। यदि उपयोगकर्ता बिना पासवर्ड के sudo चला सकता है, तो इसकी आवश्यकता नहीं है, लेकिन मैं इस कॉन्फ़िगरेशन का सुझाव नहीं देता। इसका कारण यह है कि पासवर्ड को दूरस्थ sysrtem की कमांड लाइन पर दिखाने से रोकना है। कमांड लाइन सुरक्षित नहीं हैं, कोई भी उपयोगकर्ता हर कमांड लाइन को देख सकता है ps auxwww
कर्ट फिट्ज़नर

मैं catssh कमांड में मांग रहा हूं cat \| sudo --prompt="" -S...। यदि -Sबलों sudoको स्टड से पासवर्ड पढ़ना है, तो क्या बिल्ली और पाइप बिल्कुल भी आवश्यक हैं? Ssh कमांड बस हो सकता है sudo --prompt="" -S...?
जौनपौ

@jonpau यह बिल्ली कमांड स्टड ले रहा है और इसे sudo के माध्यम से पाइप कर रहा है ताकि यह sudo पासवर्ड पास कर सके। यह दिखा रहा है कि आप कैसे ssh के माध्यम से स्टड के माध्यम से सुरक्षित रूप से पासवर्ड को पाइप कर सकते हैं।
कर्ट फिट्जनर

1

सबसे अच्छा तरीका है ssh -t user@server "sudo <scriptname>", उदाहरण के लिए ssh -t user@server "sudo reboot"। यह पहले उपयोगकर्ता और फिर रूट के लिए पासवर्ड के लिए संकेत देगा (क्योंकि हम स्क्रिप्ट या रूट विशेषाधिकार के साथ कमांड चला रहे हैं।

मुझे आशा है कि इसने आपकी मदद की और आपके संदेह को दूर किया।


0

NOPASSअपने लक्ष्य मशीन पर विन्यास में समाधान है। Http://maestric.com/doc/unix/ubuntu_sudo_without_password पर पढ़ना जारी रखें


6
इस मामले में मैं वास्तव में एक पासवर्ड चाहता हूं, और इसे सीधे टाइप करने के लिए, इसलिए यह मेरे लिए काम नहीं करता है।
डार्कफलाइन


-1

मुझे एक समस्या का सामना करना पड़ा,

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

फिर मैंने कोशिश की

#1
vim /etc/sudoers
Defaults:user1    !requiretty

काम नहीं किया

#2
user1   ALL=(user2)         NOPASSWD: ALL

यह ठीक से काम किया!


यह वास्तव में क्या पूछा जा रहा है पूरा नहीं करता है। विचार अभी भी पासवर्ड की आवश्यकता है, लेकिन इसे ssh पर टाइप करने की अनुमति दें। आपने जो भी किया है वह सिर्फ user2 पूर्ण sudo का उपयोग उपयोगकर्ता के लिए पासवर्ड के बिना किया गया है। यह विशिष्ट अनुप्रयोगों के लिए ठीक है, लेकिन सामान्य समाधान के रूप में सबसे अच्छा विचार नहीं है।
पोसुम

-7

आपके उपयोग के आधार पर, मुझे निम्नलिखित के साथ सफलता मिली:

ssh root@server "script"

यह रूट पासवर्ड के लिए संकेत देगा और फिर कमांड को सही ढंग से निष्पादित करेगा।


26
Yikes, SSH जड़ के रूप में? यह सभी प्रकार के कारणों के लिए एक बुरा विचार है।
Darkfeline

12
याद रखें ssh टेलनेट नहीं है। यह किसी भी अन्य उपयोगकर्ता के रूप में ssh और sudo चलाने की तुलना में मूल के रूप में ssh के लिए अधिक खतरनाक नहीं है। आपके पासवर्ड को ssh कनेक्शन पर उसी तरह एन्क्रिप्ट किया गया है।
स्टीफन

22
पासवर्ड सुरक्षा के चलते स्टीफन बिल्कुल सही है। हालाँकि, sudo के बजाय रूट का उपयोग करके, आप sudo के साथ जाने वाले ऑडिट ट्रेल को खो देते हैं। इसके अतिरिक्त, रूट पहुँच उपलब्ध नहीं हो सकता है।
djeikyb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.