So simulieren Sie die Benutzerinteraktion beim Ausführen eines anderen Skripts

So simulieren Sie die Benutzerinteraktion beim Ausführen eines anderen Skripts

Wenn ich eine Reihe von Linux-Befehlen ausführen möchte, klappt das problemlos, aber wie gebe ich Benutzereingaben ein, wenn ein anderes Skript aufgerufen wird und während der Ausführung nach Eingaben verlangt? Ich installiere häufig dieselbe Serverkonfiguration in Klassenzimmern, daher möchte ich es vollständig automatisieren.

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

Antwort1

Sie können TCL Expect verwenden oderPerl::Erwarten. Nachdem ich beide ausprobiert habe, bevorzuge ich Letzteres, da ich mit Perl besser vertraut bin.

Dies ist ein Ausschnitt aus einem Skript, das ich zum SSH-Zugriff auf mehrere Testserver verwende (nicht empfohlen für sensible Produktionsserver):

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
  );
}

Die vollständige Quelle können Sie hier einsehen:https://github.com/DavidGamba/bin/blob/master/cssh

verwandte Informationen