SSH के अंदर SSH "स्टडिन: एक टैटी नहीं है" के साथ विफल रहता है


58

मैं ssh के साथ मशीन एक से कनेक्ट करने की कोशिश कर रहा हूं और फिर ssh के साथ एक और मशीन दो से कनेक्ट कर सकता हूं, लेकिन मुझे यह त्रुटि मिलती है।

ssh user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

क्यों?


1
मुझे नहीं लगता कि आपको दूसरे के आसपास उन एकल उद्धरणों की आवश्यकता है ssh!
coffeMug

जवाबों:


70

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

हालाँकि, जब आप किसी दूरस्थ कमांड के बिना ssh चलाते हैं, तो यह TTY आवंटित करता है, क्योंकि आप एक शेल सत्र चलाने की संभावना रखते हैं। यह ssh otheruser@computertwo.comकमांड द्वारा अपेक्षित है , लेकिन पिछले स्पष्टीकरण के कारण, उस आदेश के लिए कोई TTY उपलब्ध नहीं है।

यदि आप एक शेल चाहते हैं computertwo, तो इसके बजाय इसका उपयोग करें, जो दूरस्थ निष्पादन के दौरान TTY आवंटन को बाध्य करेगा:

ssh -t user@computerone.com 'ssh otheruser@computertwo.com'

यह आमतौर पर तब उचित होता है जब आप अंततः ssh श्रृंखला के अंत में एक शेल या अन्य संवादात्मक प्रक्रिया चला रहे होते हैं। यदि आप डेटा ट्रांसफर करने जा रहे हैं, तो इसे जोड़ना न तो उचित है और न ही आवश्यक है -t, लेकिन तब हर ssh कमांड में डेटा-प्रोडक्शन या -सॉन्समिंग कमांड शामिल होगा, जैसे:

ssh user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'

9

SSH को रिले के रूप में उपयोग करने का एक बेहतर तरीका है: ProxyCommandविकल्प का उपयोग करें । आपको क्लाइंट मशीन पर एक कुंजी की आवश्यकता होगी जो आपको दूसरे कंप्यूटर में लॉग इन करने की अनुमति देता है (सार्वजनिक कुंजी वैसे भी अधिकांश परिस्थितियों में SSH का उपयोग करने का अनुशंसित तरीका है)। इसे अपने अंदर रखो ~/.ssh/configऔर चलाओ ssh computertwo

Host computerone
HostName computerone.com
UserName user

Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p

ncहै netcat । उपलब्ध कई संस्करणों में से कोई भी करेगा।


क्या हमें कंप्यूटर पर "अधिकृत_कीप्स" में "प्रॉक्सी" -रेल्ड लाइन जोड़ने की आवश्यकता नहीं है? मैं ओपनएसएसएच की 'प्रॉक्सी' शक्ति को देखने के लिए अर्थ रखता हूं, लेकिन अभी तक इसके आसपास नहीं पहुंची।
फेलिप अल्वारेज

7

यह मध्यवर्ती सर्वर पर एक tty डिवाइस पर एक इंटरैक्टिव टर्मिनल की उम्मीद कर रहा है।

यदि आप इस कमांड को आजमाते हैं, तो यह काम करना चाहिए:

ssh user@computer1 -t "ssh otheruser@computer2"

विकल्प के man sshलिए देखें -t


2

मैंने अनुरोध को इस तरह से हल किया ~ ~ ss config फाइल पर स्थित ~ / .ssh / config पर इस तरह ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes

1

आप ssh में PROXY जंप विकल्प का उपयोग कर सकते हैं

-J [user@]host[:port]
 Connect to the target host by first making a ssh connection to the jump host and then establishing a TCP forwarding to the ultimate destination from there.  Multiple jump hops may be specified
 separated by comma characters.  This is a shortcut to specify a ProxyJump configuration directive.

इसलिए अगर मुझे hostB से जुड़ना है लेकिन मुझे वहां पहुंचने के लिए पहले hostA से गुजरना होगा। आम तौर पर मैं होता

 ssh hostA
 [user@hostA ~]$ ssh hostB

मैं अब यह करता हूं

ssh -J hostA hostB
[user@hostB ~]$

0

आप कमांड लाइन से एक SSH विन्यास विकल्प "RequestTTY" को ओवरराइड कर सकते हैं।

कई कमांड चलाने के बाद SSH सत्र में मेरा काम करने का उदाहरण cd-serv-one.shशुरू होता /bin/bashहै:

#!/bin/bash

ssh -o "requestTTY=yes" User@ExampleHostName "cd /home/myPathFoo/myPathBar; /bin/bash"

और अब मैं सिर्फ ./cd-serv-one.shएक आवश्यक SSH सत्र शुरू करने के लिए दौड़ता हूं ।

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