दिलचस्प पोस्ट
ओरेकल एसक्यूएल डेवलपर में दी गई तालिका को किस तालिका में पता लगाया जा सकता है? उचित यूटीएफ -8 एन्कोडेड वर्णों के लिए "\ u00ed" जैसे यूनिकोड एस्केप अनुक्रम को कैसे डिकोड किया जाए? पोस्टमैन के साथ एफसीएम – अनुरोध में एक प्रमाणीकरण कुंजी (एफसीएम टोकन) अनुपलब्ध था IE9 केवल सीएसएस के माध्यम से लक्षित करें मैं एक केंद्रित JComboBox का हाइलाइट रंग कैसे बदल सकता हूँ विखंडों में एक सूची पर पुनरावृत्त करने के लिए सबसे "अजगर" तरीका क्या है? मैं एक एनएसएआरआर एनएसडीक्स के साथ कैसे सॉर्ट कर सकता हूँ? नियमित अभिव्यक्ति: संख्यात्मक श्रेणी WHERE क्लॉज में स्थिति के साथ एक बाएं जुड़ने के बाद क्यों और कब वही निजाल में शामिल होने के बराबर नहीं है? ड्रॉपडाउन सूची को प्रोग्रामेटिक रूप से सेट करना जावा स्विंग: फ़्रेम का आकार बदलना चाहिए, जिससे कि घटक जोड़ सकते हैं PHP में URL पैरामीटर प्राप्त करें यह पता लगाने का सर्वोत्तम तरीका है कि कोई वस्तु JavaScript ऐरे में है? संपत्ति द्वारा कोणीय जे एस छँटाई बहुआयामी आकार

अन्य कमांड (सु, एसएसएच, एसएच, इत्यादि) को इनपुट के रूप में पास करें

मेरे पास एक स्क्रिप्ट है जहां मुझे कमांड ुरू करने की आवश्यकता है, फिर कुछ अतिरिक्त कमांड को उस कमांड के आदेश के रूप में पास करें मैंने कोशिश की

su echo I should be root now: who am I exit echo done. 

… लेकिन यह काम नहीं करता है: su सफल होता है, लेकिन फिर कमांड प्रॉम्प्ट मुझे घूर रहा है अगर मैं प्रांप्ट पर exit हूं, तो echo और who am i आदि निष्पादित करना शुरू कर रहा who am i ! और echo done. बिल्कुल नहीं मारता है।

इसी तरह, मुझे इसके लिए ssh पर काम करने की आवश्यकता है:

 ssh remotehost # this should run under my account on remotehost su ## this should run as root on remotehost whoami exit ## back exit # back 

मैं इसे कैसे हल करूं?

मैं उन उत्तरों की तलाश कर रहा हूं जो इसे सामान्य रूप में हल करते हैं, और जो विशेष रूप से su या ssh लिए विशिष्ट नहीं हैं I इस प्रश्न के लिए इस विशेष पैटर्न के लिए एक प्रामाणिक बनने का इरादा है।

वेब के समाधान से एकत्रित समाधान "अन्य कमांड (सु, एसएसएच, एसएच, इत्यादि) को इनपुट के रूप में पास करें"

एक खोल स्क्रिप्ट आदेशों का क्रम है शेल स्क्रिप्ट फ़ाइल को पढ़ाएगा, और उन आज्ञाओं को दूसरे के बाद एक को निष्पादित करेगा।

सामान्य मामले में, यहां कोई आश्चर्य नहीं है; लेकिन एक अक्सर शुरुआती त्रुटि यह मानती है कि कुछ कमांड शेल से ऊपर ले जाएंगे, और शेल के बजाय स्क्रिप्ट फ़ाइल में निम्न कमांड निष्पादित करें जो वर्तमान में इस स्क्रिप्ट पर चल रहा है लेकिन ऐसा नहीं है कि यह कैसे काम करता है।

मूल रूप से, स्क्रिप्ट वास्तव में इंटरैक्टिव कमांडों की तरह काम करते हैं , लेकिन वास्तव में वे किस प्रकार कार्य करते हैं, उन्हें ठीक से समझा जाना चाहिए। इंटरैक्टिव रूप से, शेल (मानक इनपुट से) एक कमांड पढ़ता है, उस कमांड को चलाता है (मानक इनपुट से इनपुट के साथ), और जब यह किया जाता है, तो यह एक अन्य कमांड (मानक इनपुट से) पढ़ता है।

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

दूसरे शब्दों में, अकेले (बिना तर्क के) चलाने वाले "गलतफहमी" आदेश ( su , ssh , sh , sudo , bash आदि) एक इंटरैक्टिव शेल शुरू करेंगे, और एक इंटरैक्टिव सत्र में, यह स्पष्ट रूप से ठीक है; लेकिन जब किसी स्क्रिप्ट से चलते हैं, तो वह अक्सर नहीं होता जो आप चाहते हैं।

इन सभी आज्ञाओं को मानक इनपुट के अलावा अन्य तरीकों से कमांड स्वीकार करने के तरीके हैं। आमतौर पर, प्रत्येक कमांड एक विकल्प का समर्थन करता है जिसे इसे आदेश या तर्क के रूप में कमांड देता है:

 su root who am i ssh user@remote uname -a sh -c 'who am i; echo success' 

इनमें से कई आदेश मानक इनपुट पर आदेश भी स्वीकार करेंगे:

 printf 'uname -a; who am i; uptime' | ssh user@remote printf 'uname -a; who am i; uptime' | sh 

जो आसानी से आपको यहां दस्तावेजों का उपयोग करने की अनुमति देता है:

 ssh user@remote <<'____HERE' uname -a who am i uptime ____HERE sh <<'____HERE' uname -a who am i uptime ____HERE 

ऐसे आदेशों के लिए जो एक कमांड तर्क को स्वीकार करते हैं, वह कमांड कमांड के साथ sh या bash हो सकती है:

 sudo sh -c 'uname -a; who am i; uptime' 

एक तरफ, आपको आम तौर पर स्पष्ट रूप से exit आवश्यकता नहीं होती है क्योंकि कमांड किसी भी तरह समाप्त हो जाएगी, जब उसने स्क्रिप्ट (निष्पादन के लिए) में पारित किए गए आदेशों का क्रम

ट्रिपली के उत्तर में जोड़ना:

यह याद रखना महत्वपूर्ण है कि एक अन्य शेल के लिए यहाँ-दस्तावेज़ के रूप में स्वरूपित स्क्रिप्ट का खंड एक अलग शेल में अपने स्वयं के वातावरण (और संभवतः एक अलग मशीन पर भी) में चलाया जाता है।

अगर आपकी स्क्रिप्ट के उस ब्लॉक में पैरामीटर विस्तार, कमांड प्रतिस्थापन, और / या अंकगणित विस्तार शामिल हैं, तो आपको थोड़ी अलग तरीके से खोलने की यहां-दस्तावेज़ सुविधा का उपयोग करना चाहिए, इस आधार पर कि आप उन विस्तारों को कहाँ पर रखना चाहते हैं।

1. सभी विस्तार को मूल शेल के दायरे के भीतर करना चाहिए।

फिर यहां दस्तावेज़ का सीमांकक अनक्ॉटेड होना चाहिए।

 command <<DELIMITER ... DELIMITER 

उदाहरण:

 #!/bin/bash a=0 mylogin=$(whoami) sudo sh <<END a=1 mylogin=$(whoami) echo a=$a echo mylogin=$mylogin END echo a=$a echo mylogin=$mylogin 

आउटपुट:

 a=0 mylogin=leon a=0 mylogin=leon 

2. सभी विस्तार बच्चे के खोल के दायरे के भीतर किए जाने चाहिए।

फिर यहां दस्तावेज़ का सीमांकक उद्धृत किया जाना चाहिए।

 command <<'DELIMITER' ... DELIMITER 

उदाहरण:

 #!/bin/bash a=0 mylogin=$(whoami) sudo sh <<'END' a=1 mylogin=$(whoami) echo a=$a echo mylogin=$mylogin END echo a=$a echo mylogin=$mylogin 

आउटपुट:

 a=1 mylogin=root a=0 mylogin=leon 

3. कुछ विस्तार बच्चे शैल में किया जाना चाहिए, कुछ – माता-पिता में।

फिर यहां दस्तावेज के सीमांकक को अन्तर्निहित किया जाना चाहिए और आपको उन विस्तार अभिव्यक्तियों से बचना चाहिए जो कि बच्चे के खोल में किया जाना चाहिए

उदाहरण:

 #!/bin/bash a=0 mylogin=$(whoami) sudo sh <<END a=1 mylogin=\$(whoami) echo a=$a echo mylogin=\$mylogin END echo a=$a echo mylogin=$mylogin 

आउटपुट:

 a=0 mylogin=root a=0 mylogin=leon 

यदि आप एक सामान्य समाधान चाहते हैं जो किसी भी प्रकार के प्रोग्राम के लिए काम करेगा, तो आप expect आदेश का उपयोग कर सकते हैं।

मैन्युअल पृष्ठ से निकालें:

Expect है कि एक स्क्रिप्ट के अनुसार अन्य इंटरैक्टिव प्रोग्रामों के लिए "वार्ता" है। स्क्रिप्ट के बाद, Expect है कि एक कार्यक्रम से क्या Expect जा सकती है और सही प्रतिक्रिया क्या होनी चाहिए। एक व्याख्याकृत भाषा संवाद को निर्देशित करने के लिए शाखाओं और उच्च-स्तरीय नियंत्रण संरचनाएं प्रदान करती है। इसके अतिरिक्त, उपयोगकर्ता जब वांछित हो तो नियंत्रण और अंतःक्रिया कर सकता है, बाद में स्क्रिप्ट पर नियंत्रण वापस कर सकता है।

expect का उपयोग करते हुए यहां एक काम उदाहरण expect :

 set timeout 60 spawn sudo su - expect "*?assword" { send "*secretpassword*\r" } send_user "I should be root now:" expect "#" { send "whoami\r" } expect "#" { send "exit\r" } send_user "Done.\n" exit 

स्क्रिप्ट को एक साधारण कमांड के साथ लॉन्च किया जा सकता है:

 $ expect -f custom.script 

आप निम्न पृष्ठ में एक पूर्ण उदाहरण देख सकते हैं: http://www.journaldev.com/1405/expect-script-example-for-ssh-and-su-login-and-running-commands

नोट: @ट्रिपली द्वारा प्रस्तावित उत्तर केवल तभी काम करेगा जब आदेश की शुरुआत में एक बार मानक इनपुट पढ़ा जा सकता है, या यदि कोई tty आवंटित किया गया हो, और किसी भी इंटरैक्टिव प्रोग्राम के लिए काम नहीं करेगा।

त्रुटियों का उदाहरण यदि आप पाइप का उपयोग करते हैं

 echo "su whoami" |ssh remotehost --> su: must be run from a terminal echo "sudo whoami" |ssh remotehost --> sudo: no tty present and no askpass program specified 

SSH में, आप एकाधिक -t पैरामीटर के साथ TTY आवंटन को लागू कर सकते हैं, लेकिन जब sudo पासवर्ड मांगेगा, तो यह असफल हो जायेगी।

एक प्रोग्राम के उपयोग के बिना, किसी भी कॉल / फ़ंक्शन को कॉल करने की expect करता है जो कि stdin से जानकारी प्राप्त कर सकता है अगले कमांड को विफल कर देगा:

 ssh use@host <<'____HERE' echo "Enter your name:" read name echo "ok." ____HERE --> The `echo "ok."` string will be passed to the "read" command