"git push"에 generate-expect-send를 올바르게 사용하는 방법은 무엇입니까?

"git push"에 generate-expect-send를 올바르게 사용하는 방법은 무엇입니까?

아래 코드는떨어져 있는에 인수를 전달하기 위해 "Bash 스크립트에서 Expect를 사용하여 SSH 명령에 대한 비밀번호 제공"을 선택했습니다 git push. 잘못된 uname+pwd를 전달하는 것에 대한 예외는 발생하지 않으며, 반대로 올바른 uname+pwd를 전달하는 경우에는 발생하지 않습니다. 실제로는 아무것도 밀지 마세요. 이 문제를 해결하는 방법은 무엇입니까?

git_push.sh

if (( $# == 2 ))
then
    :
else
    echo "expecting 'username pass', got $@"
    exit 1
fi

user="$1"
pass="$2"
expect - <<EOF
 spawn git push
 expect 'User*'
 send "$user\r"
 expect 'Pass*'
 send "$pass\r"
EOF

단말기:

$ [path]/git_push.sh
spawn git push
Username for 'https://github.com': foo
Password for 'https://[email protected]': 

또는 (와일드카드 없이):

 spawn git push
 expect "Username for 'https://github.com': "
 send "$user\r"
 expect "Password for 'https://[email protected]': "
 send "$pass\r"

답변1

해결하기 위해질문:

expect - <<EOF
 spawn git push
 expect 'User*'
 send "$user\r"
 expect 'Pass*'
 send "$pass\r"
EOF
  1. 작은따옴표는 Expect에서 특별한 의미가 없으므로 User 및 Pass 프롬프트에서 리터럴 작은따옴표를 찾는 것이 좋습니다. 이러한 프롬프트에는 작은따옴표가 포함되어 있지 않으므로 expect시간 초과(기본값 10초)가 발생할 때까지 명령이 중단됩니다.

  2. 비밀번호를 보낸 후에는 푸시가 완료될 때까지 기다리지 않습니다. 예상 스크립트에 실행할 명령이 부족하여 조기에 종료되어 git 프로세스가 종료됩니다. 모든 후에 sendexpect뭔가를 해야 합니다. 이 경우 생성된 명령이 종료될 것으로 예상됩니다.expect eof

expect - <<_END_EXPECT
    spawn git push
    expect "User*"
    send "$user\r"
    expect "Pass*"
    send "$pass\r"
    set timeout -1  ; # no timeout
    expect eof
_END_EXPECT

관련 정보