जब ssh क्लाइंट का तर्क एक संवादात्मक कार्यक्रम द्वारा पीछा किया जाता है, तो sshd एक छद्म टर्मिनल का उपयोग क्यों नहीं करता है?


11

SSH सर्वर से जुड़ने का सामान्य तरीका है ssh username@ip_address। लेकिन एक उपयोगकर्ता केवल रिमोट मशीन पर एक कार्यक्रम चलाना चाह सकता है। तो कार्यक्रम का नाम सामान्य तर्क के बाद है जो है ssh username@ip_address <program_name>। उदाहरण के लिए, ssh username@ip_address ls। यह तर्क इंटरैक्टिव कार्यक्रमों को छोड़कर ठीक है (जो उपयोगकर्ता इनपुट को स्वीकार करने के साथ-साथ आउटपुट भी प्रदान करता है) उदा top। आउटपुट है

अवधि पर्यावरण चर सेट नहीं है।

जिसका अर्थ है नहीं (छद्म-) टर्मिनल sshd और शीर्ष कार्यक्रमों के बीच संलग्न है। समाधान यह है कि तर्क को जोड़ा जाए -tजहां अब पूरा कमांड बन जाता है ssh -t username@ip_address top

मेरा प्रश्न यह है कि डिफ़ॉल्ट रूप से sshd क्यों नहीं किया जा सकता है, गैर-संवादात्मक कार्यक्रमों के साथ संवाद करने के लिए एक छद्म टर्मिनल का भी उपयोग करें ताकि संवादात्मक कार्यक्रमों के लिए -tतर्क जोड़ने की आवश्यकता न हो ?


3
संक्षिप्त उत्तर है "क्योंकि यह आमतौर पर वह नहीं है जो आप चाहते हैं"।
सेलडा

मैं अनुमान लगाता हूं कि आपके प्रश्न को अनिवार्य रूप से एक राय की भीख माँगने / पकड़ बनाने के लिए संचालित किया जाएगा। लेकिन आइए इस प्रश्न को चारों ओर घुमाएं: जब बहुसंख्यक मामलों में इसकी आवश्यकता नहीं है, तो टीएसटी संसाधनों का आवंटन क्यों करना चाहिए? वास्तविक सवाल यह है कि क्यों आप एक डिफ़ॉल्ट विकल्प को बल-आबंटित नहीं कर सकते हैं ताकि आप इसे डिफ़ॉल्ट या होस्ट-विशिष्ट डिफ़ॉल्ट बना सकें?
ओथियस

@Otheus यह है config विकल्प। आप अपने कॉन्फ़िगरेशन में सेट RequestTTY yes(या force) कर सकते हैं ।
जकूजी

एर वास्तव में। लगता है कि 6 में शुरू किया गया था, लेकिन थोड़ी देर बाद तक छोटी गाड़ी। मैं केवल बहुत पुराने वितरण का उपयोग करता हूं। :)
ओथियस

6
एसएसएच मज़बूती से कैसे जान सकता है कि एक कार्यक्रम इंटरैक्टिव है? यहां तक ​​कि topबैच मोड में भी चला सकते हैं।
मुरु

जवाबों:


18

यह सच है कि, जैसा कि दूसरों ने कहा है, PTYs के पास एक निश्चित ओवरहेड है - लेकिन दूरस्थ कमांड चलाते समय PTY का उपयोग न करने का बड़ा कारण यह है कि आप जानकारी खो देते हैं।

आम तौर पर, जब आप ssh के माध्यम से दूरस्थ रूप से एक कमांड चलाते हैं, तो कमांड की धाराएं stdoutऔर stderrधाराएं स्थानीय को भेजी जाती हैं , stdoutऔर stderrइसका मतलब है कि आप उन्हें अलग से अनुप्रेषित / पाइप कर सकते हैं - उदाहरण के लिए:

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory

लेकिन अगर आप एक PTY का उपयोग करते हैं, तो सभी आउटपुट हो जाते हैं stdout, क्योंकि PTYs में आउटपुट / त्रुटि के लिए अलग-अलग धाराएँ नहीं होती हैं:

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$

यह एक अच्छी बात है जिसकी मुझे जानकारी नहीं थी।
जकूज़ी १३'१६ को

1
@ThomasDickey: शायद ही ... सवाल यह नहीं है कि "इस डिफ़ॉल्ट के डेवलपर्स की पसंद के पीछे ऐतिहासिक कारण क्या है", लेकिन " डिफ़ॉल्ट रूप से छद्म टर्मिनल का उपयोग क्यों नहीं कर सकता है " (जोर मेरा है, लेकिन शब्दांकन प्रश्न से कम या ज्यादा प्रत्यक्ष है)। तो व्यवहार में अंतर (जो स्क्रिप्टिंग मुहावरों की संख्या को तोड़ देगा) प्रासंगिक है, डेवलपर्स कैसे इस विकल्प से स्वतंत्र हैं :-)
Psmears

2
@ThomasDickey: क्या आपने भी प्रश्न पढ़ा है? यह डेवलपर्स की राय का उल्लेख कहां करता है?
psmears

1
+1 अंक (प्रदर्शन के अलावा) का उपयोग नहीं करने का एक विशिष्ट लाभ बताता है । आप अभी भी यह तर्क दे सकते हैं कि -tडिफ़ॉल्ट होना चाहिए, और इसे बंद करने के लिए एक विकल्प की आवश्यकता है, इसलिए वास्तव में मामूली प्रदर्शन का फायदा होता है जो मेरे लिए उन मामलों के लिए सबसे अधिक मायने रखता है जहां यह कोई फर्क नहीं पड़ता।
पीटर कॉर्डेस

7

इसका sshवर्णन करने के लिए मैनुअल पेज :

जब उपयोगकर्ता की पहचान सर्वर द्वारा स्वीकार कर ली गई है, तो सर्वर या तो दिए गए कमांड को गैर-संवादात्मक सत्र में निष्पादित करता है या, यदि कोई आदेश निर्दिष्ट नहीं किया गया है, तो मशीन में लॉग इन करता है और उपयोगकर्ता को एक इंटरैक्टिव सत्र के रूप में एक सामान्य शेल देता है । रिमोट कमांड या शेल के साथ सभी संचार स्वचालित रूप से एन्क्रिप्ट किए जाएंगे।

यह विशेषता है और शायद rshव्यवहार के ऐतिहासिक कारणों के कारण होता है । यह बहुत ही उचित है। अधिकांश कमांड वास्तव में इंटरएक्टिव नहीं हैं और यह पीटीवाई (जो कि 20 साल पहले अधिक महत्वपूर्ण था) को आवंटित करने के लिए मुफ्त ऑपरेशन नहीं है।


संसाधन मुद्दे प्रशंसनीय हैं, लेकिन इस बारे में टिप्पणी rshअस्पष्ट है क्योंकि उस कार्यक्रम का कोई विकल्प नहीं है।
थॉमस डिकी

@ThomasDickey मैंने कभी उपयोग नहीं किया rsh, लेकिन निश्चित रूप से कुछ प्रभाव है, विकल्पों में नहीं, लेकिन ( rshऔर rloginयदि आदेश है या नहीं) के व्यवहार में । आप rsh का उपयोग करके एक इंटरेक्टिव कमांड (जैसे दुष्ट (6) या vi (1)) नहीं चला सकते हैं; इसके बजाय rlogin (1) का उपयोग करें।
जकूजी

1

यह sshबताने के लिए कैसा है कि आप जिस कमांड को लागू कर रहे हैं वह इंटरएक्टिव है या नहीं?

यह बुरा सपना तब और बुरा हो जाता है जब आपको एहसास होता है कि आप एक गैर-यूनिक्स ओएस चलाने वाली मशीन में लॉग इन कर सकते हैं।

कोई आसान समाधान नहीं होने के कारण एक मामले को डिफ़ॉल्ट होना चाहिए था।


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