"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プロセスが終了します。すべての後に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

おすすめ記事