मैंने sudo
पासवर्ड के बिना चलने के लिए कॉन्फ़िगर किया है, लेकिन जब मैं प्रयास करता हूं, तब ssh 'sudo Foo'
भी मुझे त्रुटि संदेश मिलता है sudo: sorry, you must have a tty to run sudo
।
ऐसा क्यों होता है और मैं इसके आसपास कैसे काम कर सकता हूं?
मैंने sudo
पासवर्ड के बिना चलने के लिए कॉन्फ़िगर किया है, लेकिन जब मैं प्रयास करता हूं, तब ssh 'sudo Foo'
भी मुझे त्रुटि संदेश मिलता है sudo: sorry, you must have a tty to run sudo
।
ऐसा क्यों होता है और मैं इसके आसपास कैसे काम कर सकता हूं?
जवाबों:
ऐसा शायद इसलिए है क्योंकि आपकी /etc/sudoers
फ़ाइल (या इसमें शामिल किसी भी फ़ाइल में) है:
Defaults requiretty
... जिसके लिए sudo
TTY की आवश्यकता होती है। Red Hat सिस्टम (RHEL, Fedora ...) को डिफॉल्ट sudoers
फाइल में TTY की आवश्यकता होती है । यह कोई वास्तविक सुरक्षा लाभ प्रदान नहीं करता है और सुरक्षित रूप से हटाया जा सकता है।
रेड हैट ने समस्या को स्वीकार किया है और इसे भविष्य के रिलीज में हटा दिया जाएगा।
यदि सर्वर के कॉन्फ़िगरेशन को बदलना एक विकल्प नहीं है, तो उस गलत कॉन्फ़िगरेशन के लिए काम के आसपास, आप उन विकल्पों -t
या -tt
विकल्पों का उपयोग कर सकते हैं, ssh
जो रिमोट साइड पर एक छद्म टर्मिनल को जन्म देते हैं, लेकिन सावधान रहें कि इसका एक नंबर है प्रभाव।
-tt
इंटरैक्टिव उपयोग के लिए है। यह स्थानीय टर्मिनल को raw
मोड में रखता है ताकि आप दूरस्थ टर्मिनल के साथ बातचीत करें। इसका मतलब है कि अगर ssh
I / O किसी टर्मिनल से / से नहीं है, तो इसके दुष्प्रभाव होंगे। उदाहरण के लिए, सभी इनपुट वापस गूँजती किया जाएगा, विशेष टर्मिनल वर्ण ( ^?
, ^C
, ^U
) विशेष प्रसंस्करण का कारण होगा; आउटपुट पर, LF
s को CRLF
s में परिवर्तित किया जाएगा ... ( इस जवाब को देखें कि बाइनरी फ़ाइल को क्यों बदला जा रहा है? अधिक विवरण के लिए।
प्रभाव को कम करने के लिए, आप इसे निम्न प्रकार से लागू कर सकते हैं:
ssh -tt host 'stty raw -echo; sudo ...' < <(cat)
< <(cat)
स्थानीय टर्मिनल की स्थापना (यदि हो) में से बचने जाएगा raw
मोड। और हम stty raw -echo
रिमोट टर्मिनल की लाइन अनुशासन को पास से गुजरने के लिए उपयोग कर रहे हैं (प्रभावी रूप से इसलिए यह उस पाइप की तरह व्यवहार करता है जिसका उपयोग बिना छद्म टर्मिनल के बजाय किया जाएगा -tt
, हालांकि यह केवल उस कमांड के चलने के बाद लागू होता है, इसलिए आपको आवश्यकता है ऐसा होने तक इनपुट के लिए कुछ भेजने में देरी)।
ध्यान दें कि जब से रिमोट कमांड का आउटपुट टर्मिनल पर जाएगा, तब भी इसकी बफरिंग (जो कई अनुप्रयोगों के लिए लाइन-आधारित होगी) और बैंडविड्थ दक्षता प्रभावित होगी TCP_NODELAY
। इसके साथ ही -tt
, ssh
IPQoS को lowdelay
विरोध के अनुसार सेट करता है throughput
। आप दोनों के साथ काम कर सकते हैं:
ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)
यह भी ध्यान दें कि इसका मतलब है कि रिमोट कमांड अपने स्टड पर एंड-ऑफ-फाइल का पता नहीं लगा सकता है और रिमोट कमांड के स्टडआउट और स्टडर को एक स्ट्रीम में मर्ज कर दिया जाता है।
तो, सब के बाद इतना अच्छा काम नहीं है।
आप एक दूरस्थ होस्ट पर एक छद्म टर्मिनल अंडे देने के लिए एक तरह से मिल गया है, तो (के साथ की तरह expect
, zsh
, socat
, perl
की IO::Pty
...), तो इसका इस्तेमाल करने की है कि छद्म टर्मिनल संलग्न करने के लिए बनाने के लिए बेहतर होगा sudo
करने के लिए (लेकिन I / O) के लिए नहीं, और ssh
बिना उपयोग करें -t
।
उदाहरण के लिए, साथ expect
:
ssh host 'expect -c "spawn -noecho sh -c {
exec sudo cmd >&4 2>&5 <&6 4>&- 5>&- 6<&-}
exit [lindex [wait] 3]" 4>&1 5>&2 6<&0'
या script
(यहाँ से क्रियान्वयन मानकर util-linux
):
ssh host 'SHELL=/bin/sh script -qec "
sudo cmd <&3 >&4 2>&5 3<&- 4>&- 5>&-
" /dev/null 3<&0 4>&1 5>&2'
(यह मानते हुए (दोनों के लिए) कि दूरस्थ उपयोगकर्ता का लॉगिन शेल बॉर्न-जैसा है)।
डिफ़ॉल्ट रूप से, SUDO को TTY की आवश्यकता के लिए कॉन्फ़िगर किया गया है। यानी, SUDO को एक लॉगिन शेल से चलाया जा सकता है। आप -t
अपने SSH आह्वान पर स्विच जोड़कर इस आवश्यकता को पराजित कर सकते हैं :
ssh -t someserver sudo somecommand
-t
एक छद्म ट्टी का बल आवंटन।
यदि आप इसे विश्व स्तर पर प्रदर्शन करना चाहते हैं, तो /etc/sudoers
निर्दिष्ट करने के लिए संशोधित करें !requiretty
। यह प्रति उपयोगकर्ता, प्रति समूह या सभी-स्तर पर किया जा सकता है।
-t
झंडे के ssh
आवंटन को बाध्य करने के लिए ध्वज का उपयोग करें ।
$ ssh luci tty
not a tty
$ ssh luci -t tty
/dev/ttys003
$
-t
जब आवंटन के लिए मजबूर करनेPseudo-terminal will not be allocated because stdin is not a terminal.
मैं डॉकटर और सेंटोस 7 का उपयोग करके इस समस्या में भाग गया। मैंने निम्नलिखित कार्य पूरा किया:
yum install -y sudo
sed -i -e 's/Defaults requiretty.*/ #Defaults requiretty/g' /etc/sudoers
मुझे यह हैक https://hub.docker.com/r/liubin/fluentd-agent/~/duberile पर मिला।
एक दिलचस्प विकल्प यह है कि आप अपने उपयोगकर्ताओं और केंद्र के नियमों का प्रबंधन करने के लिए FreeIPA या IdM चलाएं। फिर आप sudo नियम बना सकते हैं और विकल्प निर्दिष्ट कर सकते हैं
! requiretty
नियम में। कमान फिर उम्मीद के मुताबिक चलेगी। आपको कॉन्फ़िगरेशन के एक सेट से सभी सर्वर और उपयोगकर्ताओं को प्रबंधित करने के भी लाभ होंगे।
मेरी भी यही समस्या थी। मेरे मामले में, समाधान दो लाइनें थीं
myscript=$(cat ssh_test.sh)
ssh -t user@host "$myscript"
स्पष्टीकरण:
उन कमांड्स को रखें जिन्हें आप (sudo कमांड्स सहित) स्क्रिप्ट में चलाना चाहते हैं जैसे "ssh_test.sh"।
पूरी स्क्रिप्ट को "myscript" नामक एक चर में पढ़ें।
केवल एक-टी के साथ ssh को आमंत्रित करें और कमांड के बजाय वेरिएबल की आपूर्ति करें।
इससे पहले, मैं स्टड से पढ़ने के संयोजन और हेरेडोक्स का उपयोग करके समस्याओं में भाग गया
requiretty
इसके डिफॉल्ट सुडोर्स में था। इसे नए रिलीज में तय किया जाएगा