Bash betiğinde Bekle ve gönder komutlarıyla sudo komutları nasıl çalıştırılır?


10

sudoKomutları nasıl çalıştıracağımı bilen var expectmı? Aşağıdaki denedim ama bu çalışmıyor. Birisi bana öneri verebilir mi lütfen?

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

Aşağıdaki komut dosyasını denediğimde, hatasız yürütüldü, ancak çıktı almadım. İşte komut dosyası ve yürütüldüğünde çıktı. Burada nerede hata yapıyorum?

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

infaz

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

Yanıtlar:


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'de (ve uzatma ile beklemek), kıvırcık parantezler kabuğun tek tırnakları gibi davranır: değişken genişlemeyi engeller.

Çok desenli beklenti formu, bir desen göremeyebileceğiniz durumlarda kullanışlıdır. exp_continueİçinde esasen açıklamada "döngü" böylece şifre gönderebiliriz bekliyoruz ve hızlı bekliyoruz. Bilgi istemi deseniyle ilişkilendirilmiş bir işlem olmadığından, kontrol, wait komutundan diğerine geçer.

Bunu ayrı bir komut dosyası olarak kaydetmenizi tavsiye ederim. İlk satır

#!/usr/bin/expect -f

Bir kabuk komut dosyasına gömmek istiyorsanız:

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

İlk "END" etrafındaki tırnaklara dikkat edin - burada tüm belgeyi tek tırnak içine alma etkisi vardır, böylece Kabuk Beklentisi değişkenlerini yorumlama konusunda endişelenmenize gerek kalmaz


Merhaba Glenn, komut dosyası hatasız yürütülüyor, ancak scirpt çıktısını göremiyorum. Senaryoda yanlış bir şey mi yapıyorum. Evet ise, lütfen çıktıyı ayrı bir dosyaya kaydettiğimi bildirin. sasuke @ njob yürüttüğüm komut dosyası: ~ $ ./hypr.sh spawn ssh sasuke @ hostname sasuke @ hostname's password: sasuke @ hostname: ~ $ output = $ (sudo virsh listesi --all | awk '/ running / {print $ 2} '| tail -10) sudo virsh dominfo' $ output 'sasuke @ njob: ~ $
sasuke

Yorumlarda kod gönderemezsiniz, lütfen sorunuza ekleyin
glenn jackman

bunun için üzgünüm. Teşekkürler yaptım. Lütfen bana yardım et.
sasuke

Bilmiyorum. exp_internal 1Komut dosyasının en üstüne ekleyin ve ayrıntılı çıktıyı okuyun.
glenn jackman

3

Çığlıklarımı paylaşmak istiyorum. Bunu sistemimde denedim. bu iyi çalışıyor.

#!/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

Çalışması gereken "etkileşim" komutuyla bitirmeye çalışın.

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

0

Bence tırnak içindeki tırnak işaretlerini ters çevirmeniz gerekebilir. Aksi takdirde expectkomutun "awk" den sonra sona erdiğini düşünür:

send "output=$(sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); sudo virsh dominfo $output"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.