bash 스크립트에서 Expect & send 명령으로 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내에서 본질적으로 문 "루프"그래서 당신은 암호를 보낼 수 있습니다 기대하고 프롬프트를 기대하는 것을 계속한다. 프롬프트 패턴과 연관된 조치가 없으므로 제어는 expect 명령에서 다음 명령으로 전달됩니다.

이것을 별도의 스크립트로 저장하는 것이 좋습니다. 첫 줄은

#!/usr/bin/expect -f

쉘 스크립트에 임베드하려면 다음을 수행하십시오.

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

첫 번째 "END"주위의 따옴표에 주목하십시오. 여기에서 전체 문서를 인용하는 효과가 있으므로 쉘이 Expect 변수를 해석하는 것에 대해 걱정할 필요가 없습니다.


안녕하세요 글렌, 스크립트가 오류없이 실행되고 있지만 스크립트의 출력을 볼 수 없습니다. 스크립트에서 잘못된 일을하고 있습니까? 그렇다면 출력을 별도의 파일로 저장하십시오. 여기 내가 sasuke @ njob을 실행하는 스크립트가 있습니다 : ~ $ ./hypr.sh spawn ssh sasuke @ hostname sasuke @ hostname의 암호 : sasuke @ hostname : ~ $ output = $ (sudo virsh list --all | awk '/ running / {print $ 2} '| tail -10) sudo virsh dominfo'$ output 'sasuke @ njob : ~ $
sasuke

의견에 코드를 게시 할 수 없습니다. 질문에 추가해주세요
glenn jackman

아 죄송합니다. 고마워요 도와주세요.
사스케

몰라 exp_internal 1스크립트 상단에 추가 하고 자세한 출력을 읽습니다.
glenn jackman 2016 년

3

나는 나의 scirpt를 공유하고 싶다. 나는 내 시스템에서 이것을 시도했다. 이것은 잘 작동합니다.

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

"interact"명령으로 종료하십시오.

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

0

따옴표 내에서 따옴표를 백 슬래시해야 할 수도 있습니다. 그렇지 않으면 expect"awk"다음에 명령이 종료된다고 생각합니다.

send "output=$(sudo virsh list --all | awk \"/running/{print \$2}\" | tail -2); sudo virsh dominfo $output"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.