Expect에서 BASH 명령을 생성하는 방법은 무엇입니까?

Expect에서 BASH 명령을 생성하는 방법은 무엇입니까?

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

expectTCL(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구문보다 구문에 더 가깝습니다 .fishsh

또한 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"

관련 정보