如何正确使用spawn-expect-send进行“git推送”?

如何正确使用spawn-expect-send进行“git推送”?

下面的代码改编自一个办法到“在 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. 发送密码后,您不会等待推送完成:expect 脚本用完了要运行的命令并过早退出,从而终止了 git 进程。在任何之后send,你应该expect做点什么。在这种情况下,您期望生成的命令结束,用 表示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

相关内容