बैश स्क्रिप्ट में Expo के साथ sudo कमांड को कैसे निष्पादित करें और कमांड भेजें?


10

क्या कोई मुझे बता सकता है कि sudoकमांड को कैसे निष्पादित किया जाए expect? मैंने निम्नलिखित की कोशिश की लेकिन यह काम नहीं कर रहा है। क्या कोई मुझे सुझाव दे सकता है?

set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr\'s password:"
send "$pw\r"
expect "#"
send "output=$(sudo virsh list --all | awk "/running/{print \$2}" | tail -2); sudo virsh dominfo $output"
expect "password:"
send "$pw\r"
expect "#"

जब मैंने नीचे की स्क्रिप्ट की कोशिश की, तो यह त्रुटियों के बिना निष्पादित हुई, लेकिन मुझे आउटपुट नहीं मिला। यहां स्क्रिप्ट और आउटपुट है जब यह निष्पादित होता है। मैं यहाँ गलती कहाँ कर रहा हूँ?

set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
send {sudo virsh dominfo "$output"}    ;# don't know if you need quotes there
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}

क्रियान्वयन

sasuke@njob:~$ ./hypr.sh 
spawn ssh sasuke@hostname 
sasuke@hostname's password: 
sasuke@hostname:~$ output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -10)sudo virsh dominfo '$output' sasuke@njob:~$

जवाबों:


10
set login "sasuke"
set addr "hostname"
set pw "mypasswd"
spawn ssh $login@$addr
expect "$login@$addr's password:"
send "$pw\r"
expect "#"
send {output=$(sudo virsh list --all | awk '/running/{print $2}' | tail -2)}
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}
send {sudo virsh dominfo "$output"}    ;# don't know if you need quotes there
expect {
    password: {send "$pw\r"; exp_continue}
    "#"
}

Tcl (और, विस्तार से, उम्मीद), घुंघराले ब्रेसिज़ शेल के एकल उद्धरण की तरह कार्य करते हैं: चर विस्तार को रोकते हैं।

बहु-अपेक्षा का पैटर्न उस स्थिति के लिए उपयोगी होता है जहाँ आप एक पैटर्न नहीं देख सकते हैं। exp_continueबयान अनिवार्य रूप से "छोरों" के भीतर ताकि आप पासवर्ड भेज सकते हैं उम्मीद और शीघ्र उम्मीद कर रहे हैं। चूंकि शीघ्र पैटर्न से जुड़ी कोई कार्रवाई नहीं है, इसलिए नियंत्रण अगले कमांड से अगले एक तक जाता है।

मैं आपको इसे एक अलग स्क्रिप्ट के रूप में सहेजने की सलाह दूंगा। पहली पंक्ति होनी चाहिए

#!/usr/bin/expect -f

यदि आप शेल स्क्रिप्ट में एम्बेड करना चाहते हैं:

#!/bin/sh
expect <<'END'
   # code as above
END

पहले "END" के आसपास के उद्धरणों पर ध्यान दें - जिसमें पूरे यहाँ-दस्तावेज़ को उद्धृत करते हुए एकल का प्रभाव है, इसलिए आपको एक्सपेक्ट चर की व्याख्या करने वाले शेल के बारे में चिंता करने की ज़रूरत नहीं है


हाय ग्लेन, स्क्रिप्ट बिना किसी त्रुटि के क्रियान्वित हो रही है, लेकिन मैं स्कोर के आउटपुट को देखने में असमर्थ हूं। क्या मैं स्क्रिप्ट में कोई गलत काम कर रहा हूं? यदि हाँ, तो कृपया मुझे बताएं कि मैं आउटपुट को अलग फ़ाइल में सहेजता हूँ। यहाँ स्क्रिप्ट है कि मैं sasuke को निष्पादित कर रहा हूँ @ njob: ~ $। चल रहा है / {$ 2 प्रिंट} | ससुके @ Njob 'पूंछ -10) sudo virsh dominfo' $ उत्पादन ': ~ $
ससुके

आप टिप्पणियों में कोड पोस्ट नहीं कर सकते, कृपया इसे अपने प्रश्न में जोड़ें
ग्लेन जैकमैन

ओह, मुझे इसके लिए खेद है धन्यवाद मैंने किया। कृपया मेरी मदद करें।
सासुके

पता नहीं। exp_internal 1स्क्रिप्ट के शीर्ष पर जोड़ें और क्रिया आउटपुट पढ़ें।
ग्लेन जैकमैन

3

मैं अपनी खुराफात साझा करना चाहूंगा। मैंने अपने सिस्टम पर यह कोशिश की। यह ठीक काम कर रहा है।

#!/usr/bin/expect
set username "myname"
set password "mypasswd"
set hosts "hostname"
foreach line [split $ip \n] {
spawn ssh -o StrictHostKeyChecking=no $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "sudo virsh list|awk '{print \$2}'|grep 'inmobi' >vm.list; for host in `cat vm.list`; do sudo virsh dominfo \$host >> vm.info; done\n"
expect "$"
send -- "$password\n"
expect "$"
send -- "exit\n"

1

इसे "इंटरेक्ट" कमांड के साथ समाप्त करने की कोशिश करें जो इसे काम करना चाहिए।

spawn ssh -l $username $ip -p $sshport
sleep 5
expect "password:"
send "$pass\r"
interact

0

मुझे लगता है कि आपको उद्धरणों के भीतर उद्धरण वापस करने की आवश्यकता हो सकती है। अन्यथा expectसोचता है कि आदेश "जाग" के बाद समाप्त होता है:

send "output=$(sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); sudo virsh dominfo $output"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.