Ich habe ein cooles Skript entwickelt, das die Ausgabe erzeugt, die ich brauche, aber es wird nur auf dem Bildschirm angezeigt, also muss ich kopieren und dann die Befehle einfügen, um sie auszuführen. Hier ist die verkürzte Version meines Skripts:
%Vor%Okay, es durchläuft also die Liste der IP-Adressen in iptext.txt, dann folgt eine geoIP-Suche, wenn (in diesem Beispiel) zwei geoIP-Übereinstimmungen in der Liste vorhanden sind, sagen wir für Armenien und Brasilien, I Die Ausgabe wird wie folgt im Shell-Fenster angezeigt:
%Vor% Das ist großartig, aber ich möchte mehr als nur ausgeben, ich möchte, dass der Befehl /etc/csf/csf.pl -d
ausgeführt wird, und die IP in den Zeilen, die mit dem Ländernamen übereinstimmen, in der Liste blockieren (nur und nur).
Ich habe verschiedene Dinge mit meinen begrenzten Kenntnissen des Shell-Scriptings ausprobiert, aber bisher scheint nichts zu funktionieren. Also gibt es eine Option für ECHO, die ich vermisse, die tatsächlich den Befehl ausführen würde, anstatt nur die Linie auszudrucken?
Eine einfache Methode, die keine Änderung Ihres Skripts erfordert, wäre die Ausgabe des Befehls an eine andere Bash-Instanz. So:
%Vor% Das -
teilt bash mit, dass es Befehle von stdin lesen soll.
Wenn Sie jedoch keine schnelle Lösung suchen, können Sie den Befehl auch dynamisch erstellen und ausführen. So:
%Vor%Es gibt einen bash-eingebauten Eval, der Befehle ausführt, so wie sie in Ihrer Shell eingegeben wurden. Zum Beispiel können Sie in Ihrem Skript Folgendes tun:
%Vor%Damit wird Ihr Echo in einer Subshell verarbeitet und die Ausgabe wird so ausgeführt, wie Sie es in Ihrer Shell eingegeben haben, gefolgt von enter.
Siehe unten, Auszug aus Bash-Handbuch:
eval [arg ...] Die Argumente werden gelesen und zu einem einzigen Befehl verkettet. Dieser Befehl wird dann von der Shell gelesen und ausgeführt, und ihr Exit-Status wird als zurückgegeben der Wert von eval. Wenn keine Argumente oder nur Nullargumente vorhanden sind, gibt eval 0 zurück.
Verwenden Sie grep -E
und stattdessen ein Muster:
Erklärung: echo
wird den Befehl drucken, aber nicht ausführen. Lassen Sie es einfach weg, um den Befehl tatsächlich auszuführen.
Und anstatt das Skript fünfmal auszuführen, verwenden Sie grep
, um nach einem der fünf Muster gleichzeitig zu suchen.
Und Sie sollten
verwenden %Vor%statt Backticks; es ist sicherer.