
IP 주소를 제공하는 Expect 스크립트가 있습니다.
#!/bin/expect -f
set nodename [lindex $argv 0]
spawn virsh console $nodename
expect "Escape character is"
send "\n"
expect "localhost login: " {
send "root\n"
expect "Password: "
send "cloud123\n"
}
expect "~]#" {
send "\n"
send "ifconfig | grep 192.168.1. | awk \'{print \$2}\'"
send "\n"
expect '(\d+\.\d+\.\d+\.\d+)'
send "logout"
}
스크립트가 이 IP 주소를 반환하기를 원합니다. 다음과 같이 쉘 스크립트에서 이 Expect 스크립트를 호출합니다.
#!/bin/bash
ip=$(expect GetIP.exp nodetwo)
echo $ip
내 Expect 스크립트가 출력을 쉘 스크립트로 반환하도록 하려면 어떻게 해야 합니까?
답변1
좋습니다. 로깅을 켜고 끄는 것이 작동하지 않습니다. 아마도 타이밍 문제일 것입니다.
다음과 같이 호출하면 다음 기대 스크립트가 작동합니다.
# ip=$(./virsh-expect nodetwo | tr -d '\r' | grep '^192.168')
# echo $ip
192.168.122.99
tr
여기서 주목해야 할 중요한 점은 grep을 사용하여 쉘 스크립트에서 IP를 찾으면 출력에서 캐리지 리턴이 제거된다는 것입니다. Expect 스크립트는 이를 "기대"하려고 시도하지도 않고 단지 다음 루트 쉘 프롬프트를 예상하고 종료합니다.
또한 예상 스크립트를 보다 일반적으로 만들었습니다. "localhost login:" 대신 "login:"만 예상하고(실제로 호스트 이름이 있는 모든 VM에서는 실패하며 대부분 실패할 것임) 간단한 "# " 루트 쉘 프롬프트의 경우.
#!/usr/bin/expect -f
set nodename [lindex $argv 0]
spawn virsh console $nodename
expect "Escape character is"
send "\n\n"
expect "login: " {
send "root\n"
expect "Password: "
send "cloud123\n"
}
expect "# " {
send "ifconfig | awk \'/192\.168/ {print \$2}\'"
send "\n"
expect "# "
send "exit"
}
expect
또 다른 옵션은 전혀 사용하지 않고 대신 Perl Expect.pm
이나 Python을 사용하는 pexpect
것입니다. 예상 세션과 거의 동일하게 작동 expect
하지만 예상 세션에서 데이터를 추출하는 것이 더 쉽습니다.
expect
나는 여전히 .NET을 사용하는 것보다 가상 머신의 IP 주소를 얻는 더 좋은 방법이 있다고 생각합니다 virsh console
.
virsh dumpxml
다음은 MAC 주소를 추출한 다음 다음을 사용하여 일치하는 dnsmasq-dhcp 항목을 찾는 방법입니다 ./var/log/daemon.log
awk
# mac=$(virsh dumpxml nodetwo | sed -n -e "/mac address/ s/.*'\([^']*\)'.*/\1/ p" | tail -1)
# ip=$(awk "/dnsmasq.*DHCPACK.*$mac/ {print \$7}" /var/log/daemon.log | tail -1)
# echo $ip
192.168.122.99
내 시스템의 가상 머신에는 두 개의 네트워크 인터페이스가 있으며 마지막 인터페이스에만 관심이 있으므로 tail -1
온라인으로 사용합니다 virsh dumpxml
. tail -1
온라인에 접속하는 awk
것은 우리가 얻을 수 있는 것만 확인하는 것입니다.최신MAC 주소는 dhcp에 의해 할당되었습니다.
(실제로 제가 시스템에서 테스트하고 있는 VM은 "nodetwo"가 아니라 "sid"라고 하는데, 귀하의 질문에 맞게 예상 스크립트의 출력과 비밀번호를 편집했습니다. 또한 제가 사용하고 있는 IP 주소도 마찬가지입니다. 내 VM의 경우 192.168.1.x 대신 192.168.122.x입니다. 그러나 이는 세부 사항에서 사소한 차이입니다.
고쳐 쓰다
나는 내가 만든 freebsd 가상 머신의 IP를 찾기 위해 어젯밤에 이것을 직접 사용해야 했습니다. dhcpd
대신 ISC를 사용하고 있으므로 dnsmasq
로그 형식이 약간 다릅니다. 이 버전은 다음 dnsmasq
과 함께 작동합니다 dhcpd
.
$ cat find-vm-ip-by-name.sh
#!/bin/bash
mac=$(virsh dumpxml "$1" | sed -n -e "/mac address/ s/.*'\([^']*\)'.*/\1/ p" | tail -1)
ip=$(awk "/dnsmasq.*DHCPACK.*$mac/ {print \$7} ; /dhcpd.*DHCPACK.*$mac/ {print \$8}" /var/log/daemon.log | tail -1)
echo $ip
답변2
다음을 시도해 볼 수 있습니다.
send_user $ip
"send_user" 출력은 표준 출력으로 전송됩니다. 스크립트가 실행되는 동안 화면에 메시지를 보내는 데 사용됩니다. 사용자 피드백, 배너 및 오류 메시지 생성에 적합합니다.