下面的代码改编自一个办法到“在 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
单引号在 Expect 中没有特殊含义,因此您要在 User 和 Pass 提示中查找文字单引号。这些提示不会包含单引号,因此
expect
命令会挂起,直到超时(默认 10 秒)发生。发送密码后,您不会等待推送完成: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