Как имитировать взаимодействие с пользователем при запуске другого скрипта

Как имитировать взаимодействие с пользователем при запуске другого скрипта

Когда я хочу запустить кучу команд Linux, я справляюсь, но как мне дать пользователю ввод, когда вызывается другой скрипт и запрашивает ввод во время выполнения? Я часто устанавливаю одну и ту же настройку сервера в классах, поэтому я хочу полностью автоматизировать ее.

#!/bin/bash
sudo apt-get install python -y
sudo apt-get install python-m2crypto -y
sudo apt-get install git-core -y
git clone https://github.com/learningequality/ka-lite.git
cd ka-lite/
./setup_linux.sh

#the script works until here
#now, while the setup script is running, the following needs to happen
#I need to press enter twice
#enter the password twice
#press enter twice
#press y and then enter

#here are some things I tried, none of them worked
send "yes\n"
send "yes\n"
#echo | <Press [enter] to continue...> #enter
#echo | <return> #enter
Password8 #password
Password8 #password
echo | <yourfinecommandhere> #enter
echo | <return> #enter
y

решение1

Вы можете использовать TCL Expect илиPerl::Ожидание. Попробовав оба варианта, я отдал предпочтение последнему, поскольку я более знаком с Perl.

Это фрагмент скрипта, который я использую для подключения по SSH к нескольким тестовым серверам (не рекомендуется для уязвимых производственных серверов):

if( defined $password ) {
  $exp->expect(
    $timeout,
    [   qr/no\)\?\s+$/i => sub {
        my $self = shift;
        $self->send("yes\n");
        exp_continue;
      }
    ],
    [   qr/password:\s+$/i => sub {
        my $self = shift;
        $self->send("$password\n");
        exp_continue;
      }
    ],
    '-re',
    qr/~/,    #' wait for shell prompt, then exit expect
  );
}

Полный исходный текст можно посмотреть здесь:https://github.com/DavidGamba/bin/blob/master/cssh

Связанный контент