Docker 컨테이너 배포를 자동화하려고 합니다. 배포를 계속하려면 세 가지 프롬프트를 수동으로 입력해야 합니다. 단, 순차적으로 채울 수는 없습니다. 이러한 필드가 나타나는 순서는 매우 이상합니다. 먼저 비밀번호와 확인을 요청합니다(두 필드가 인접해 있음). 그런 다음 OpenVPN 스크립트가 해당 작업을 수행한 다음 FQDN이 인증서를 생성하도록 요구합니다.
expect
그래서: 필드 X에 값 X를 채우고 입력 필드 Y가 나타나면 값 Y를 채우도록 지시할 수 있는지 궁금합니다 . 즉, expect
입력 프롬프트 자동 인식을 알려주고 그에 맞게 입력할 수 있나요?
답변1
물론 그것이 기대되는 이유입니다. 여기 명령이 exp_continue
핵심입니다.
expect {
"password: " {send "$password\r"; exp_continue}
"confirmation" {send "$confirm\r"; exp_continue}
"FQDN" {send "$fqdn\r"; exp_continue}
"some other pattern"
}
물론 실제 상황과 일치하도록 참조된 스키마를 변경해야 합니다.
이 구조를 사용하면 패턴을 어떤 순서로든 일치시킬 수 있습니다. 패턴이 전혀 나타날 필요도 없습니다.
"다른 모드"가 나타나면 연관된 작업 블록이 없으므로 포함된 예상 명령의 종료를 트리거하고 나머지 스크립트를 계속할 수 있습니다.
Expect가 프로세스를 제어하려면 Expect 내에서 프로세스를 시작해야 합니다. 이 시도:
#!/bin/bash
port=$1
export hostname=$2
export OVPN_DATA="ovpn-data-$port"
docker volume create --name $OVPN_DATA
/usr/bin/expect <<'END_EXPECT'
set timeout -1
spawn docker run -v $env(OVPN_DATA):/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u udp://$env(hostname)
expect {
"Enter PEM pass phrase:" {
# this should match whether it's the initial or confirmation prompt
send "secret\r"
exp_continue
}
"Common Name" {
send "$env(hostname)\r"
exp_continue
}
eof
}
END_EXPECT
docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
docker run -dit --restart unless-stopped --name=$port -v $OVPN_DATA:/etc/openvpn -d -p $port:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn