Как написать bash-скрипт для ответа другой программы - PullRequest
4 голосов
/ 19 января 2011

У меня есть скрипт bash, который выполняет несколько задач, включая python manage.py syncdb в новой базе данных. Эта команда запрашивает ввод, например, информацию для входа в систему для администратора. В настоящее время я просто набираю это в командной строке каждый раз. Есть ли способ, которым я могу автоматически предоставлять эти ответы как часть скрипта bash?

Спасибо, я ничего не знаю о bash.

Я использую Ubuntu 10.10.

Ответы [ 4 ]

3 голосов
/ 19 января 2011

Я ответил на аналогичный вопрос по SF, но этот вопрос носит более общий характер, и его хорошо иметь на SO.

"Вы хотите использовать , ожидайте для этого. Вероятно, это уже на вашем компьютере [попробуйте which expect]. Это стандартный инструмент для любого вида интерактивной автоматизации командной строки. Это библиотека Tcl, так что вы получите некоторые навыки Tcl по пути бесплатно. Осторожно, это вызывает привыкание. "

Я должен упомянуть в этом случае, что есть также pexpect , который похож на Python.

#!/path/to/expect
spawn python manage.py syncdb
expect "login:*"
send -- "myuser\r"
expect "*ssword:*"
send -- "mypass\r"
interact
3 голосов
/ 19 января 2011

Если рассматриваемая программа не может прочитать входные данные из stdin, такие как:

echo "some input" | your_progam

тогда вам нужно посмотреть что-то вроде expect и / или autoexepect

0 голосов
/ 19 января 2011

Вы можете сделать это, например, скрипт login.py:

if __name__ == '__main__':
    import sys
    user = sys.stdin.readline().strip()
    passwd = sys.stdin.readline().strip()

    if user == 'root' and passwd == 'password':
        print 'Login successful'
        sys.exit(0)

    sys.stderr.write('error: invalid username or password\n')
    sys.exit(1)

good-credentials.txt

root
password

bad-credentials.txt

user
foo

Затем вы можете автоматически выполнить вход, используя:

$cat good-credentials.txt | python login.py
Login successful

$cat bad-credentials.txt | python login.py 
error: invalid username or password

Недостатком этого подхода является сохранение пароля в виде простого текста, что не является хорошей практикой.

0 голосов
/ 19 января 2011

Вы можете задать значения по умолчанию для переменных.В строках 4 и 5, если переменные RSRC и LOCAL не установлены, для них устанавливаются значения по умолчанию.Таким образом, вы можете задать опции для вашего скрипта или использовать значения по умолчанию

#!/bin/bash
RSRC=$1
LOCAL=$2
: ${RSRC:="/var/www"}
: ${LOCAL:="/disk2/backup/remote/hot"}
rsync -avz -e 'ssh ' user@myserver:$RSRC $LOCAL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...