2012-04-19 27 views
15

मैं एक ssh सर्वर पर लॉगइन करने के लिए की तरह कुछ पर अमल करने की कोशिश कर रहा हूँ और:सेट वातावरण चर SSH_ASKPASS या sudoers में askpass, resp

sudo: no tty present and no askpass program specified 
:

ssh [email protected] 'sudo echo "foobar"' 

दुर्भाग्य से मैं एक त्रुटि हो रही है

Google ने मुझे पर्यावरण चर SSH_ASKPASS सेट करने या sudoers फ़ाइल में askpass सेट करने के लिए कहा था। मेरे रिमोट मशीन डेबियन 6 पर चल रहा है और मैं संकुल ssh-askpass और ssh-askpass-GNOME स्थापित किया है और मेरे sudoers फ़ाइल इस तरह दिखता है:

Defaults  env_reset 
Defaults  askpass=/usr/bin/ssh-askpass 

# User privilege specification 
root ALL=(ALL) ALL 
user ALL=(ALL) ALL 

किसी को बता सकते हैं कि मैं क्या कर रहा हूँ गलत कर रहा है और इसे बेहतर कैसे करें।

उत्तर

18

इस त्रुटि संदेश से छुटकारा पाने के दो तरीके हैं। रिमोट सूडो प्रक्रिया के लिए एक छद्म टर्मिनल प्रदान करना आसान तरीका है। आप विकल्प -t के साथ ऐसा कर सकते हैं:

ssh -t [email protected] 'sudo echo "foobar"' 
+6

... और मुश्किल तरीके से? –

+1

@ bradley.ayers: समस्या यह है कि 'सुडो' एक tty से पासवर्ड पढ़ना चाहता है। या तो आप सूडो के लिए एक टीटी प्रदान करते हैं या आप सूडो में पासवर्ड चेक से बचते हैं। यदि आप सुरक्षा प्राप्त करना चाहते हैं तो उत्तरार्द्ध अधिक कठिन है। – nosid

+0

@nosid इसके लिए धन्यवाद। –

-3

कैसे sudoers फाइल में इस जोड़ने के बारे में:

user ALL=(ALL) NOPASSWD: ALL 
+3

यह बहुत सुरक्षित नहीं है। –

+1

मैं सहमत हूं, लेकिन केवल आपके नियंत्रण में मौजूद सर्वरों के लिए अनुशंसित – Akshat

+3

सुडो पासवर्ड आवश्यकताओं को हटाने खराब है। यदि आप "सभी" निष्पादन योग्य के लिए कोई पासवर्ड निर्दिष्ट नहीं करते हैं तो यह भी बदतर है। ऐसा कुछ नहीं है जिसे आपको ठीक से विचार करना चाहिए क्योंकि सर्वर आपके नियंत्रण में हैं। ऐसे सुरक्षित विकल्प हैं जिनके लिए सर्वर पर कोई बदलाव की आवश्यकता नहीं है। –

1

संपादित दिसंबर 2013: यहाँ एक छोटी जवाब है: एक दिन ले लो या दो खुद को परिचित करने के लिए पायथन पुस्तकालय के साथ "Fabric"। फैब्रिक रिमोट कार्यों को 1 या अधिक सर्वरों को प्रेषित करने के संबंध में मुद्दों का एक टन हल करता है।

आप शायद अभी भी लक्ष्य प्रणाली पर उपयोगकर्ता नाम सेट करना चाहते हैं जो पासवर्ड रहित आदेश चला सकता है (और आप इसे करने के लिए फैब्रिक का भी उपयोग कर सकते हैं!)।

बस सावधान रहें कि फैब्रिक के कुछ पहलू पूरी तरह से पाइथोनिक नहीं हैं। इसके अलावा, फैब्रिक को पहले सिसडमिन के साथ दिमाग में डिजाइन किया गया था, जो लोग सर्वर के खिलाफ कमांड बैच करना चाहते हैं। यदि आप कुछ और करने की कोशिश कर रहे हैं (जैसे कुछ बहुत ही विशिष्ट सर्वर या परिदृश्य स्वचालित करें) तो आप पूरी तरह से समझना चाहेंगे कि "सेटिंग्स के साथ" और/या @ ड्रॉल्स सजावट कैसे काम करती है। मैंने वापस नहीं देखा है ...

(और हाँ, मुझे रिमोट एसएसएच कमांड "रिमोट" सिस्टम पर काम कर रहा है। यानी, सर्वर ए सर्वर सर्वर से कनेक्ट करने के लिए सर्वर बी से पूछता है, और कमांड की वापसी है सर्वर ए पर देखा गया है, भले ही ए सीधे सर्वर सी से बात नहीं करता है। प्रयोगशाला सेटअप आसान बनाता है!)।

मूल प्रतिक्रिया: इस समस्या के कई समाधान हैं। मैदान के लिए घोड़े; कुछ अलग-अलग परिस्थितियों में दूसरों की तुलना में बेहतर हैं।

सवाल पूछा गया है, "कोई टीटीवी" त्रुटि को कैसे हल करें। ऐसा लगता है कि फोकस लगता है इसलिए मुझे लगता है कि सुडौर्स के बारे में बात सिर्फ टीटीवी मुद्दे से बचने के लिए काम करने का प्रयास है।

विकल्प 1) Askhat का उत्तर बहुत अच्छा काम करता है ... ज्यादातर समय। असल में, हमेशा "-tt" निर्दिष्ट करें जो अधिक लक्ष्य प्रणालियों पर काम करता है।

नोट यदि आप पैरामीको जैसे एसएसएच लाइब्रेरी का उपयोग कर रहे हैं, तो आप अभी भी समस्या को दबाएंगे, जिसमें "-t" करने का सहज ज्ञान नहीं है।

विकल्प 2) मेरा उत्तर - एक ASKPASS निर्दिष्ट करना है जो एसटीडीआईएन है।तो यह उदाहरण सूडो पासवर्ड आवश्यकता और टीटीवी दोनों को संतुष्ट करता है: $ shell> ssh [email protected] 'echo "पासवर्ड" | sudo -S echo "foobar"'

विकल्प 3) हां, आप सुडो को अक्षम कर सकते हैं सभी या कुछ उपयोगकर्ताओं पर पासवर्ड चेक, लेकिन यह एक उत्पादन सर्वर पर अच्छा नहीं है।

विकल्प 4) आप दूरस्थ "requiretty" (या सेट कर सकते हैं सभी या sudoers में कुछ उपयोगकर्ताओं के लिए "! Requiretty"। फिर, एक उत्पादन बॉक्स पर शांत नहीं।

यह सर्वर परिवर्तन करने से बचने के लिए सबसे अच्छा है। किसी दिन उस सर्वर को प्रतिस्थापित किया जाएगा, सेटिंग डिफ़ॉल्ट पर वापस जा रही हैं, और आपकी स्क्रिप्ट काम करना बंद कर देगी।

ध्यान दें कि एक बार जब आप अपने सभी विकल्पों को समझ लेते हैं, तो यह बहुत अधिक स्वचालन के दरवाजे खुलता है (उदाहरण के लिए आपके पर एक स्क्रिप्ट लैपटॉप सर्वर होस्टनाम की सूची से कनेक्ट हो सकता है, और उन सर्वरों पर सूडो कार्यों को निष्पादित किए बिना, उन सर्वरों पर स्क्रिप्ट को प्रतिलिपि बनाने की आवश्यकता के बिना)।

5

एक टीटीवी आवंटित करने के बजाय, या कमांड लाइन में देखा जा सकता है कि पासवर्ड सेट करने के बजाय, ऐसा कुछ करें।

एक खोल फ़ाइल है कि के गूंज की तरह आपके पासवर्ड का पता बनाएँ:

#!/bin/bash 

echo "mypassword" 

फिर उसकी प्रतिलिपि कि नोड के लिए आप scp इस तरह का उपयोग कर चाहते हैं:

scp SudoPass.sh somesystem:~/bin 

फिर जब आप निम्नलिखित ssh कार्य करें:

ssh somesystem "export SUDO_ASKPASS=~/bin/SudoPass.sh;sudo -A command -parameter" 
+0

'निर्यात SUDO_ASKPASS =' echo "mypassword" के बारे में कैसे करें; sudo whatever_command'? मैंने इसे स्वयं नहीं किया है, लेकिन मुझे लगता है, यह काम करना चाहिए ... – anishsane

+0

यह मेरे लिए काम नहीं करता है। मुझे अभी भी मिलता है: '$ SUDO_ASKPASS = $ HOME/askpass.sh; sudo -A "echo हैलो" निम्नलिखित आउटपुट: 'sudo: कोई askpass प्रोग्राम निर्दिष्ट नहीं है, SUDO_ASKPASS' –

+0

@white_gecko सेट करने का प्रयास करें: क्योंकि आपके पास पर्यावरण चर निर्यात नहीं है। आज़माएं: 'निर्यात SUDO_ASKPASS = $ HOME/askpass.sh; sudo -A "/ bin/true" ' – miklosq

2

एक और तरीकाचलाने के लिए है आदेश "मानक त्रुटि को शीघ्र लिखें और टर्मिनल उपकरण का उपयोग कर के बजाय मानक इनपुट से पासवर्ड पढ़ें" करने के लिए(man के अनुसार) एक साथ cat साथ:

cat | ssh [email protected] 'sudo -S echo "foobar"' 

बस इनपुट पासवर्ड के लिए प्रेरित किया जा रहा है जब सेवा मेरे।

एक लाभ यह है कि आप दूरस्थ कमांड के उत्पादन में एक फाइल करने के लिए बिना "[sudo] पासवर्ड के लिए ..." उस में अनुप्रेषित कर सकते हैं है:

cat | ssh [email protected] 'sudo -S tar c --one-file-system /' > backup.tar 
+0

यह मुझे करीब मिला .... (वास्तव में पासवर्ड के लिए संकेत दिया गया था), लेकिन टाइपिंग कुछ भी नहीं किया। इसके बजाय, मुझे उपयोगकर्ता नाम के लिए '[सूडो] पासवर्ड मिला: क्षमा करें, पुनः प्रयास करें।' छोड़कर 3 बार स्वचालित रूप से दिखाई दे रहा है। –