fragen stichworte

Führen Sie mehrere bash-Skripts mit Expect-Code aus und lassen Sie sie laufen

Ich habe mehrere Bash-Skripte, die einige Aktionen ausführen, die eine Benutzereingabe erfordern.

Ich brauche jedoch einen, um weiterlaufen zu können. Wenn ich jedoch erwartet, wird der Befehl Expect warten, während das Skript ausgeführt wird, und mein Hauptskript wird nicht fortgesetzt.

IE: script1 erzeugt ein Skript als root:

#!/bin/bash
expect << EOF
spawn su root -c "/bin/bash script2.sh"
expect "Password:"
send "test\n"
set timeout -1
expect eof;
EOF

script2.sh zeigt einen Bildschirm an:

#!/bin/bash
screen -dm nastyscript.sh

nastyscript.sh erzeugt eine Binärdatei, die weiterhin ausgeführt werden muss:

#!/bin/bash
expect << EOF
spawn mybinary
expect "*Enter password for my binary"
send "test\r"
expect "*I am running"
set timeout -1
expect -re . { exp_continue } eof { exit }
expect eof;
EOF

Da jedoch ein Skript darauf wartet, dass der Abschluss der Verarbeitung erwartet wird, wird mein Hauptskript nicht fortgesetzt.

Kann ich das tun?

antworten

Zunächst möchten Sie absolut kein Passwort mit Expect senden. Abgesehen davon, dass es sich um einen sehr schlechten Stil handelt, wird die Sicherheit Ihres Systems völlig untergraben, da Sie ein Benutzerkennwort im Klartext speichern müssen. Jeder weiß heutzutage auswendig, dass Sie niemals Passwörter jemals im Klartext speichern sollten.

Ich würde empfehlen, die Manpage für sudoers nachzulesen. Dann können Sie Sudo aus dem Skript heraus verwenden, ohne die Passwörter im Klartext speichern zu müssen. Eine solide Lösung wäre wahrscheinlich eine ausführbare Datei mit suid root. Shell-Skripte können aus Sicherheitsgründen keine suid haben, daher müsste ein kleines Programm erstellt werden.

Wenn Sie jedoch sicher sind, dass mehrere parallel laufende Prozesse miteinander kommunizieren müssen, bietet bash Version 4 eine Lösung in Form des Schlüsselworts coproc. Grundsätzlich setzen Sie coproc vor eine Befehlszeile. Für einfache Befehle hat dies ungefähr die gleiche Wirkung wie ein & am Ende der Befehlszeile. Der Prozess wird parallel zu Ihrem Skript ausgeführt. Der Unterschied ist, dass Sie mit coproc die Dateideskriptoren stdout und stdin des anderen im Array COPROC verfügbaren Prozesses haben, sodass Ihr Skript mit dem anderen Prozess kommunizieren kann. Siehe http://www.gnu.org/software/bash/manual/html_node/Coprocesses.html

Dann möchten Sie vielleicht auch den anderen Prozess wait, bevor Ihr Skript beendet wird.