Pertanyaan Bagaimana menjalankan perintah sudo dengan Expect & mengirim perintah di skrip bash?


Adakah yang bisa membiarkan saya tahu bagaimana melaksanakannya sudo perintah dengan expect? Saya mencoba yang berikut tetapi ini tidak berhasil. Adakah yang bisa memberi saya saran, tolong?

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, tapi saya tidak mendapatkan output. Di sini adalah skrip dan output saat 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:~$

9
2018-06-11 23:41


asal




Jawaban:


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, mengharapkan), kurung kurawal bertindak seperti tanda kutip tunggal: menghambat ekspansi variabel.

Bentuk multi-pola harapan berguna untuk kasus di mana Anda mungkin tidak melihat pola. Itu exp_continue pernyataan dasarnya "loop" dalam yang diharapkan sehingga Anda dapat mengirim kata sandi dan terus mengharapkan prompt. Karena tidak ada tindakan yang terkait dengan pola yang cepat, kontrol beralih dari perintah yang diharapkan ke yang berikutnya.

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

#!/usr/bin/expect -f

Jika Anda ingin menanamkan dalam skrip shell:

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

Perhatikan tanda kutip di sekitar "AKHIR" pertama - yang memiliki efek mengutip satu persatu seluruh dokumen di sini sehingga Anda tidak perlu khawatir tentang shell menafsirkan variabel Expect


10
2018-06-12 01:13



Hai Glenn, skrip ini berjalan tanpa kesalahan, tetapi saya tidak dapat melihat output dari scirpt. Apakah saya melakukan sesuatu yang salah dalam naskah. Jika ya tolong beritahu saya saya menyimpan output dalam file terpisah. di sini adalah script yang saya jalankan sasuke @ njob: ~ $ ./hypr.sh menelurkan ssh sasuke @ hostname sasuke @ kata sandi hostname: sasuke @ hostname: ~ $ output = $ (daftar sudo virsh --all | awk '/ menjalankan / {print $ 2} '| tail -10) sudo virsh dominfo' $ output 'sasuke @ njob: ~ $ - sasuke
Anda tidak dapat memposting kode di komentar, silakan tambahkan di pertanyaan Anda - glenn jackman
oh maafkan saya untuk itu. Terima kasih sudah melakukannya. Tolong bantu saya keluar. - sasuke
T tahu. Menambahkan exp_internal 1 ke bagian atas skrip dan baca output verbose. - glenn jackman


Saya ingin berbagi scirpt saya. Saya mencoba ini di sistem saya. ini berfungsi 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"

3
2018-06-17 23:49





Saya pikir Anda mungkin perlu membalikkan tanda kutip dalam tanda kutip. Jika tidak expect berpikir perintah berakhir setelah "awk":

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

0
2018-06-12 00:54





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

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

0
2017-10-05 16:35