Expect 스크립트가 있고 입력을 제공하기 위해 BASH 명령을 생성하고 싶습니다. 다음 구문을 사용할 때:
spawn /bin/bash docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki`
또는:
spawn docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
다음 오류가 발생합니다.
bad flag "-it": must be -glob, -regexp, -exact, -notransfer, -nocase, -i, -
indices, -iread, -timestamp, -timeout, -nobrace, or --
while executing
"expect {
spawn (/bin/bash) docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn
ovpn_initpki
"Enter PEM pass phrase:" {send "DefPEMVPNPassPhra..."
(file "addcontainer.exp" line 7)
BASH 명령이 생성될 것으로 예상되는지 어떻게 알 수 있나요?
답변1
expect
TCL(TCL 인터프리터)에서 환경 변수에 액세스하기 위한 구문은 다음과 같습니다 $env(VARNAME)
.
spawn docker run -v $env(OVPN_DATA):/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki
일부 셸 코드를 해석하는 셸을 실행하려면 실행할 수 있습니다 sh -c the-code
(또는 여기의 셸 코드 bash -c
에 특정한 내용이 없더라도). bash
이것이 system()
대부분의 언어가 하는 일입니다.
spawn sh -c {
docker run -v "$OVPN_DATA:/etc/openvpn" --rm -it kylemanna/openvpn ovpn_initpki
}
{...}
이는 TCL의 강력한 제안입니다. 또한 쉘 변수 확장 주위에 누락된 따옴표를 추가했습니다. 그렇지 않으면 zsh
// rc
구문보다 구문에 더 가깝습니다 .fish
sh
또한 spawn
모든 expect ...
진술의 서문을 작성합니다. 명령은 spawn
상호 작용하려는 명령을 시작하는 곳이고 명령문은 expect ...
해당 명령의 특정 출력을 기다리는 곳입니다.
위 코드에서는 spawn
전혀 실행되지 않으며 인수 spawn
내부의 인수 expect
는 이전에 생성된 명령(있는 경우)의 출력이나 표준 입력(없는 경우)에서 검색되는 패턴으로 처리됩니다.
답변2
출력은 spawn
명령 이름이 발견될 때 플래그 해석이 중지되지 않음을 보여줍니다.
일반적인 규칙은 --
명령 옵션(구문 분석 및 해석해야 함)과 호출해야 하는 인수(무시하고 전달해야 함) 사이의 구분 기호 역할을 하는 것입니다.
출력에는 가능한 옵션 중 하나가 spawn
나열되어 --
이 규칙을 따른다는 것을 나타냅니다. 지정해 보세요.
spawn /bin/bash -- -c "docker run ..."
답변3
노력하다:
spawn /bin/bash
send "docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki"