Bagaimana cara menjalankan perintah sudo dengan Harapkan & mengirim perintah dalam skrip bash?

10

Adakah yang bisa memberi tahu saya cara menjalankan sudoperintah expect? Saya mencoba yang berikut tetapi ini tidak berhasil. Adakah yang bisa memberi saya saran?

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 "#"

Ketika saya mencoba skrip di bawah ini, dijalankan tanpa kesalahan, tetapi saya tidak mendapatkan hasilnya. Ini adalah skrip dan output ketika dijalankan. Di mana saya membuat kesalahan di sini?

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}
    "#"
}

Eksekusi

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:~$
sasuke
sumber

Jawaban:

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}
    "#"
}

Dalam Tcl (dan, dengan ekstensi, harapkan), kurung kurawal bertindak seperti tanda kutip tunggal shell: menghambat ekspansi variabel.

Bentuk multi-pola harapan berguna untuk kasus di mana Anda mungkin tidak melihat pola. The exp_continuePernyataan dasarnya "loop" dalam mengharapkan sehingga Anda dapat mengirim password dan terus berharap prompt. Karena tidak ada tindakan yang terkait dengan pola prompt, kontrol berpindah dari perintah harapan ke yang berikutnya.

Saya sarankan Anda menyimpan ini sebagai skrip terpisah. Baris pertama seharusnya

#!/usr/bin/expect -f

Jika Anda ingin menyematkan skrip shell:

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

Perhatikan kutipan di sekitar "AKHIR" pertama - yang memiliki efek mengutip tunggal seluruh dokumen di sini sehingga Anda tidak perlu khawatir tentang shell menafsirkan variabel Harapkan

glenn jackman
sumber
Hai Glenn, skrip dijalankan tanpa kesalahan, tetapi saya tidak dapat melihat output dari skirpt. Apakah saya melakukan kesalahan pada skrip? Jika ya tolong beri tahu saya saya menyimpan output dalam file terpisah. inilah skrip yang saya jalankan sasuke @ njob: ~ $ ./hypr.sh menelurkan ssh sasuke @ hostname sasuke @ kata sandi hostname: sasuke @ hostname: ~ $ output = $ (sudo virsh list --all | awk '/ running / {print $ 2} '| tail -10) sudo virsh dominfo' $ output 'sasuke @ njob: ~ $
sasuke
Anda tidak dapat memposting kode dalam komentar, silakan tambahkan dalam pertanyaan Anda
glenn jackman
oh saya minta maaf untuk itu. Terima kasih sudah melakukannya. Tolong bantu saya.
sasuke
Tidak tahu Tambahkan exp_internal 1ke bagian atas skrip dan baca output verbose.
glenn jackman
3

Saya ingin membagikan tipuan saya. Saya mencoba ini di sistem saya. ini bekerja dengan baik.

#!/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"
sasuke
sumber
1

Cobalah untuk mengakhirinya dengan perintah "berinteraksi" yang seharusnya berfungsi.

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

Saya pikir Anda mungkin perlu backslash tanda kutip dalam tanda kutip. Kalau tidak expectberpikir perintah berakhir setelah "awk":

send "output=$(sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); sudo virsh dominfo $output"
Paul
sumber