Вопрос по bash – Как использовать ожидаемый в скрипте Bash

7

Я пытаюсь написать скрипт, который извлекает последнюю версию моего программного обеспечения из git-репо и обновляет файлы конфигурации. При извлечении из репо, я должен ввести пароль. Я хочу, чтобы скрипт автоматизировал все, поэтому мне нужно, чтобы он автоматически заполнялся для меня. Я нашел этот сайт, который объяснил, как использовать & quot; ожидать & quot; искать запрос пароля и отправить пароль. Я не могу заставить его работать, хотя. Вот мой сценарий:

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

Предположим, вы забыли спавна. bdecaf
подождите, вы имеете в виду, что я должен использовать send для каждой строки ??? LordZardeck
я не хочу этой части. Я запускаю это на своей локальной машине. LordZardeck
Никакие git, cd и cp не являются действительными ожидаемыми командами. Вы должны породить раковину для этого. bdecaf
Почему вы всегда должны вводить пароль при извлечении из удаленного хранилища? Это пульт на базе SSH или HTTP? Вы уверены, что ssh-ключи не подходят? Как насчет хранения имени пользователя и пароля в вашем.netrc файл? Там может быть несколько способов сделать это целоеexpect скрипт не нужен. larsks

Ваш Ответ

1   ответ
17

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

Ваша проблема в том, что у вас естьexpect сценария, и вы рассматриваете его какbash скрипт. 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

Однако, как отметили в комментариях жаворонки, лучше использовать ssh-ключи. Тогда вы могли бы избавиться отexpect позвони в целом.

Error: User Rate Limit Exceeded

Похожие вопросы