Git

如何正確使用 spawn-expect-send 進行“git push”?

  • March 10, 2022

下面的程式碼改編自“在 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://foo@github.com': 

或者(沒有萬用字元):

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

要解決預期的問題:

expect - <<EOF
spawn git push
expect 'User*'
send "$user\r"
expect 'Pass*'
send "$pass\r"
EOF
  1. 單引號在期望中沒有特殊含義,因此您在 User 和 Pass 提示中尋找文字單引號。這些提示將不包含單引號,因此該expect命令會掛起,直到發生超時(預設 10 秒)。
  2. 發送密碼後,您無需等待推送完成:expect 腳本用完了要執行的命令並過早退出,從而殺死了 git 程序。在 any 之後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

引用自:https://unix.stackexchange.com/questions/693807