8

ソフトウェアの最新バージョンを Git リポジトリから取得して構成ファイルを更新するスクリプトを作成しようとしています。ただし、リポジトリからプルするときは、パスワードを入力する必要があります。スクリプトですべてを自動化したいので、自動的に入力する必要があります。Expect を使用してパスワード プロンプトを検索し、パスワードを送信する方法を説明しているこのサイトを見つけました。私はそれを機能させることはできません。

これが私のスクリプトです:

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
set timeout -1

clear
echo "Updating Source..."
cd sourcedest
git pull -f origin master

match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof

git checkout -f master
cp Config/database.php.bak Config/database.php
cp webroot/index.php.bak webroot/index.php
cp webroot/js/config.js.bak webroot/js/config.js

私は何を間違っていますか?

これは私が入手したサイトです: http://bash.cyberciti.biz/security/expect-ssh-login-script/

4

1 に答える 1

20

これは、私自身のいくつかの観察を伴って、コメントからほとんど取られています。しかし、誰もこれに対する本当の答えを提供したいとは思わないので、ここに行きます:

問題は、Expectスクリプトがあり、それをBashスクリプトのように扱っていることです。cd期待は、、、cpおよびのgit意味を知りません。Bashはそうします。Expectを呼び出すBashスクリプトが必要です。例えば:

#!/usr/bin/env bash

password="$1"
sourcedest="path/to/sourcedest"
cd $sourcedest

echo "Updating Source..."
expect <<- DONE
  set timeout -1

  spawn git pull -f origin master
  match_max 100000

  # Look for password prompt
  expect "*?assword:*"
  # Send password aka $password
  send -- "$password\r"
  # Send blank line (\r) to make sure we get back to the GUI
  send -- "\r"
  expect eof
DONE

git checkout -f master
cp Config/database.php.bak Config/database.php
cp webroot/index.php.bak webroot/index.php
cp webroot/js/config.js.bak webroot/js/config.js

ただし、コメントでlarsksが指摘しているように、SSHキーを使用した方がよい場合があります。expectその後、呼び出しを完全に取り除くことができます。

于 2012-05-07T00:34:23.850 に答える