it-swarm.com.de

Kann ich ECHO verwenden, um Befehle auszuführen?

Ich habe ein cooles Skript entwickelt, das die Ausgabe liefert, die ich brauche, aber es wird nur auf dem Bildschirm angezeigt. Ich muss also die Befehle kopieren und dann einfügen, damit sie ausgeführt werden. Hier ist die abgekürzte Version meines Skripts:

#!/bin/bash
runc=/etc/csf/csf.pl -d
for IP in `tail -400 iptext.txt`
do
cc=`geoiplookup $IP`
echo -e $runc $IP    $cc | grep Algeria
echo -e $runc $IP    $cc | grep Argentina
echo -e $runc $IP    $cc | grep Armenia
echo -e $runc $IP    $cc | grep Azerbaijan
echo -e $runc $IP    $cc | grep Bolivia
echo -e $runc $IP    $cc | grep Brazil
done

Okay, es durchläuft also die Liste der IP-Adressen in iptext.txt, dann wird jeweils eine geoIP-Suche durchgeführt, wenn (in diesem Beispiel) zwei geoIP-Übereinstimmungen in der Liste enthalten sind, sagen wir für Armenien und Brasilien, ich sehe Ausgabe so zum Shell Fenster:

/etc/csf/csf.pl -d 46.162.242.17 GeoIP Country Edition: AM, Armenia
/etc/csf/csf.pl -d 200.147.38.50 GeoIP Country Edition: BR, Brazil

Das ist großartig, aber ich möchte mehr als nur Ausgabe. 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 (nur und nur) blockiert wird.

Ich habe mit meinem begrenzten Wissen über Shell-Scripting verschiedene Dinge ausprobiert, aber bisher scheint nichts zu funktionieren. Gibt es eine Option für ECHO, die ich vermisse, die den Befehl tatsächlich ausführen würde, anstatt nur die Zeile auszudrucken?

15
jols

Eine einfache Methode, die keine Änderung Ihres Skripts erfordert, besteht darin, die Ausgabe des Befehls an eine andere Bash-Instanz zu übergeben. So was:

yourscript | bash -

Der - sagt der bash, dass sie Befehle aus stdin lesen soll.


Wenn Sie jedoch nicht nach einer schnellen Lösung suchen, können Sie den Befehl auch dynamisch erstellen und ausführen. So was:

cmd="ls"
if [ "foo" != "bar" ] ; then
    cmd="$cmd -a"
then

# ... and so on

# now execute it:
$cmd
14
hek2mgl

Sie können eval verwenden, um eine Zeichenfolge auszuführen:

eval $cmdstring
9
Syntax

Setzen Sie Ihren Befehl einfach in die folgenden Klammern:

echo $(ls)

Sie können auch Text vor dem Befehl haben

echo "The date is $(date)"

Zum Beispiel

echo "Enter Text Here $(Command Here)"
7
Neeraj Verma

Es gibt ein bash-eval, das Befehle ausführt, wie sie in Ihrer Shell eingegeben wurden. In Ihrem Skript können Sie zum Beispiel Folgendes tun:

eval $(echo -e $runc $IP    $cc | grep Algeria)

Dadurch wird Ihr Echo in einer Subshell verarbeitet und die Ausgabe wird so ausgeführt, wie Sie es in Ihre Shell eingegeben haben, gefolgt von der Eingabetaste. 

Siehe unten Auszug aus dem Bash-Handbuch:

eval [arg ...] Die Argumente werden zusammen gelesen und in einem einzigen Befehl zusammengefasst. Dieser Befehl wird dann von der Shell gelesen und ausgeführt, und sein Exitstatus wird als .__ zurückgegeben. der Wert von eval. Wenn keine Argumente oder nur Null-Argumente vorhanden sind, gibt eval 0 zurück.

6
Flo Doe
echo `pwd`

der obige Befehl funktioniert für mich.

0
Bobo

Verwenden Sie stattdessen grep -E und ein Muster:

$runc $IP    $cc | grep -E 'Algeria|Argentina|...'

Erläuterung: echo gibt den Befehl aus, führt ihn jedoch nicht aus. Lassen Sie es einfach weg, um den Befehl tatsächlich auszuführen.

Statt das Skript fünfmal auszuführen, suchen Sie mit grep nach einem der fünf Muster gleichzeitig.

Und du solltest verwenden 

cc=$(geoiplookup $IP)

anstelle von Backticks; es ist sicherer.

0
Aaron Digulla