2012-05-01 72 views
7

Tôi đang cố gắng viết một tập lệnh kéo phiên bản mới nhất của phần mềm của tôi từ một repo git và cập nhật các tập tin cấu hình. Khi kéo từ repo, tôi phải nhập mật khẩu. Tôi muốn kịch bản tự động hóa mọi thứ, vì vậy tôi cần nó để tự động điền nó vào cho tôi. Tôi tìm thấy trang web này giải thích cách sử dụng "mong đợi" để tìm lời nhắc mật khẩu và gửi mật khẩu. Tôi không thể làm cho nó hoạt động được. Đây là tập lệnh của tôi:sử dụng kỳ vọng trong 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 

Tôi đang làm gì sai? đây là trang web tôi nhận được từ: http://bash.cyberciti.biz/security/expect-ssh-login-script/

+0

Giả sử bạn quên đẻ trứng. – bdecaf

+0

Tôi không muốn phần đó. Tôi đang chạy cái này bên trong máy cục bộ của mình. – LordZardeck

+0

Không git, cd và cp không có lệnh mong đợi hợp lệ. Bạn cần phải sinh ra một vỏ cho nó. – bdecaf

Trả lời

16

Điều này được lấy khá nhiều từ nhận xét, với một vài quan sát của riêng tôi. Nhưng không ai dường như muốn cung cấp một câu trả lời thực sự này, vì vậy ở đây đi:

Vấn đề của bạn là bạn có một mong đợi kịch bản và bạn đang đối xử với nó như một bash kịch bản. Kỳ vọng không biết điều gì là số cd, cpgit. Bash làm. Những gì bạn muốn là một kịch bản bash mà làm cho một cuộc gọi để mong đợi. Ví dụ:

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

Tuy nhiên, như larsks đã chỉ ra trong nhận xét, bạn có thể nên sử dụng khóa ssh hơn. Sau đó, bạn có thể loại bỏ hoàn toàn cuộc gọi expect.

+0

nó làm việc cho tôi! cảm ơn bạn rất nhiều! – Deano

Các vấn đề liên quan