2013-07-16 17 views
8

Wymyśliłem fajny skrypt, który wytworzy wynik, którego potrzebuję, ale wyświetla się tylko na ekranie, więc muszę skopiować, a następnie wkleić komendy, aby je wykonać. Oto skrócona wersja mojego skryptu:Czy mogę używać ECHO do wykonywania poleceń?

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

Ok, więc pętle listę adresów IP w iptext.txt, następnie robi odnośnika GeoIP na siebie, jeśli (w tym przykładzie) Istnieją dwa mecze GeoIP na liście, powiedzmy dla Armenii i Brazylii, będę widzieć wyjście tak do okna powłoki:

/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 

to jest dobre, ale chcę więcej niż tylko wyjście, faktycznie chcę komenda /etc/csf/csf.pl -d do uruchomienia, i zablokuj (tylko i wyłącznie) adres IP w liniach pasujących do nazwy kraju na liście.

Próbowałem różnych rzeczy z moją ograniczoną znajomością skryptów powłoki, ale jak dotąd nic nie działa. Czy jest jakaś opcja dla ECHO, której mi brakowało, która faktycznie uruchomiłaby polecenie, a nie tylko wydrukowała linię?

+0

muszę wycofać swoją publikację odpowiedzi w samym pytaniu. Proszę zamieścić własną odpowiedź lub zatwierdzić jedną z istniejących. Zauważ, że twoje rozwiązanie było prawie identyczne z odpowiedzią Flo Doe. –

Odpowiedz

8

Prostym sposobem, który nie wymaga modyfikacji twojego skryptu, byłoby potokowanie wyjścia polecenia do innej instancji bash. Tak:

yourscript | bash - 

- mówi bash, który powinien ją przeczytać polecenia ze standardowego wejścia.


Jednakże, jeśli nie szukasz szybkiego rozwiązania, możliwe jest dynamiczne budowanie i wykonywanie polecenia. Tak:

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

# ... and so on 

# now execute it: 
$cmd 
+1

Można również potokować pętlę 'for' w' bash': 'dla x w ...; robić ...; zrobione | bash -' –

+0

@glennjackman Nie byłam pewna i zbyt leniwy, aby testować;) ... wypuszczanie wyjścia z pętli brzmi jak najlepsze rozwiązanie dla mnie. dzięki – hek2mgl

7

Można użyć eval wykonać ciąg:

eval $cmdstring 
0

Korzystając grep -E i wzór Zamiast:

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

Objaśnienie: echo będzie drukować polecenia, ale nie wykonać to. Po prostu pomiń to, aby faktycznie wykonać polecenie.

Zamiast 5 razy uruchamiać skrypt, użyj grep, aby wyszukać dowolny z pięciu wzorów naraz.

I należy użyć

cc=$(geoiplookup $IP) 

zamiast backticks; to jest bezpieczniejsze.

5

Istnieje wbudowana ewaluacja bash, która wykonuje polecenia tak, jakby zostały wpisane w twojej powłoce. Na przykład w skrypcie można wykonać następujące czynności:

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

ten przetwarza echo w podpowłoce i wyjście zostanie wykonany jak wpisałeś go w muszli, a następnie wprowadzić.

Poniżej exerpt z podręcznika bash:

eval [arg ...] Argumenty są odczytywane i łączone razem w jedno polecenie. Ta komenda jest następnie odczytywana i wykonywana przez powłokę, a jej kod wyjścia jest zwracany jako wartość eval. Jeśli nie ma żadnych argumentów, lub tylko zerowe argumenty, eval zwraca 0.

0
echo `pwd` 

powyżej prac dowodzenia dla mnie.

1

Wystarczy umieścić polecenia w nawiasach tak:

echo $(ls)