수동으로 실행할 때 입력을 요청하는 JBOSS 설치 프로그램이 있습니다. 다음은 아래와 같은 실행 예입니다.
[sp@sp baseInstaller]$ ./advStart.sh config
Buildfile: /home/sp/jboss/sp/baseInstaller/build.xml
init:
config:
[groovy] coa.install.props properties
[groovy]
[groovy] ? indicates a response is required from you
[groovy] [value] is the current value
[groovy] to keep current value just press <enter>
[groovy] or type new value and press <enter>
[groovy] {value,value..} shows the allowed values
[groovy] installer version 6.0.3.4
[groovy]
[groovy] Jboss Server Config Options (changeable after initial config)
[groovy] -------------------------------------------------------------
[groovy] ? host [sp.resource.com]
resource.com
[groovy] ip=10.50.55.90
[groovy] host changed to resource.com
[groovy] ? bind to host only or all ports (all has security implications)
[groovy] [host]
[groovy] {host,all,custom}
all
[groovy] bind to host only or all ports (all has security implications) changed to all
[groovy] ? min memory [64]
64
이 프로세스를 자동화하기 위해 예상 스크립트를 작성해 보았습니다. 아래는 내 스크립트입니다.
[sp@sp baseInstaller]$ cat saba.sh
#!/usr/bin/expect
# Accessing command line arguments
set arg1 [lindex $argv 0]
set arg2 [lindex $argv 1]
# Printing the arguments
puts "Argument 1: $arg1"
puts "Argument 2: $arg2"
cd /home/sp/jboss/sp/baseInstaller
spawn ./advStart.sh config
# Expect the prompt for the argument with a timeout of 10 seconds
expect {
"? host [sp.resource.com]" {
# Send the host value
send "$arg1\r"
exp_continue
}
"? bind to host only or all ports (all has security implications)" {
# Send the argument value
send "$arg2\r"
}
timeout {
puts "Error: Timed out while waiting for the prompt."
exit 1
}
eof
} -timeout 10
# Wait for the script to finish
wait
이제 이 스크립트를 실행할 때 아래에 도달하고 더 이상 진행되지 않습니다. 이 문제를 해결하는 데 도움을 주실 수 있나요?
[sp@sp baseInstaller]$ expect saba.sh resource.com all
Argument 1: resource.com
Argument 2: all
spawn ./advStart.sh config
Buildfile: /home/sp/jboss/sp/baseInstaller/build.xml
init:
config:
[groovy] coa.install.props properties
[groovy]
[groovy] ? indicates a response is required from you
[groovy] [value] is the current value
[groovy] to keep current value just press <enter>
[groovy] or type new value and press <enter>
[groovy] {value,value..} shows the allowed values
답변1
expect
사용되는 양식에 대해 매우 엄격하십시오 {}
. -timeout 10
끝에 내용을 추가 하면 {}
더 이상 여러 줄 {}
형식을 인식하지 못하고 일치하는 패턴을 잘못 해석합니다. debug (option) 을 사용하여 스크립트를 실행하면 이를 확인할 수 있습니다 -d
.
다음의 간단한 예를 생각해 보세요.
expect {
"abc" exit 1
} -timeout 10
디버그가 표시됩니다
expect: does "" (spawn_id exp4) match glob pattern "\n "abc" exit 1\n"? no
"10"? no
보시다시피 패턴은 "{"와 "}" 사이의 모든 것으로 간주되며 "-timeout"은 일치할 때 실행되는 명령으로 간주됩니다. "10"은 일치시킬 다음 패턴입니다.
"? host [sp.resource.com]"
또한 패턴은 기본적으로 "glob"으로 가정되고 [
문자 세트로 시작하는 특수 문자의 경우에도 마찬가지이므로 패턴이 일치하지 않습니다. -ex
의미하는 패턴 앞에 접두어를 붙여야 합니다.완전히 적합구함. 공백이 데이터와 정확하게 일치하는지 확인하세요.