2012-05-01 2 views
7

Я пытаюсь написать сценарий, который вытаскивает последнюю версию моего программного обеспечения из git repo и обновляет конфигурационные файлы. Однако, вытаскивая из репо, я должен ввести пароль. Я хочу, чтобы скрипт автоматизировал все, поэтому мне нужно, чтобы он автоматически заполнил его для меня. Я нашел этот сайт, который объяснил, как использовать «ожидание» для поиска пароля и отправки пароля. Я не могу заставить его работать. Вот мой сценарий:using expect in bash script

#!/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/

+0

Предположим, что вы забыли икру. – bdecaf

+0

Я не хочу эту часть. Я запускаю это внутри своей локальной машины. – LordZardeck

+0

Нет git, cd и cp не являются допустимыми командами ожидания. Вам нужно создать оболочку для нее. – bdecaf

ответ

16

Это в значительной степени взято из комментариев, с несколькими моими наблюдениями. Но никто, кажется, хотят, чтобы обеспечить реальный ответ на это, так что здесь идет:

Ваша проблема у вас есть ожидать сценарий и вы его обработки, как Баш сценария. Expect не знает, что cd, cp, и git средний. Бэш делает. Вы хотите, чтобы сценарий 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 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 
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.

+0

это сработало для меня! Спасибо большое! – Deano