34

必要な出力を生成するクールなスクリプトを思いつきましたが、それは画面にしか表示されないため、コマンドをコピーして貼り付けて実行する必要があります。これが私のスクリプトの短縮版です:

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

よし、iptext.txt の IP アドレスのリストをループし、それぞれについて geoIP ルックアップを実行します。(この例では) リストに 2 つの geoIP 一致がある場合、たとえばアルメニアとブラジルの場合、出力が表示されます。シェル ウィンドウに次のように入力します。

/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

これは素晴らしいことですが、出力だけではなく、実際に/etc/csf/csf.pl -dコマンドを実行して、リスト内の国名に一致する行の IP のみをブロックする必要があります。

シェル スクリプトの限られた知識でさまざまなことを試しましたが、これまでのところ何もうまくいかないようです。行を印刷するだけでなく、実際にコマンドを実行する、欠落しているECHOのオプションはありますか?

4

6 に答える 6

23

スクリプトを変更する必要がない簡単な方法は、コマンドの出力を別の bash インスタンスにパイプすることです。このような:

yourscript | bash -

-、stdin からコマンドを読み取る必要があることを bash に伝えます。


ただし、迅速な解決策を探していない場合は、コマンドを動的にビルドして実行することもできます。このような:

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

# ... and so on

# now execute it:
$cmd
于 2013-07-16T10:30:35.800 に答える
12

eval文字列を実行するために使用できます:

eval $cmdstring
于 2013-07-16T10:38:00.420 に答える
9

bash 組み込みの eval があります。これは、シェルで入力されたようにコマンドを実行します。たとえば、スクリプト内で次のことができます。

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

これにより、エコーがサブシェルで処理され、シェルで入力した後に入力したように出力が実行されます。

以下の bash マニュアルからの抜粋を参照してください。

eval [arg ...] args が読み取られ、1 つのコマンドに連結されます。次に、このコマンドがシェルによって読み取られて実行され、その終了ステータスが eval の値として返されます。引数がない場合、または null 引数のみの場合、eval は 0 を返します。

于 2013-07-16T10:41:30.617 に答える
0

grep -E代わりに と パターンを使用します。

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

説明:echoコマンドを出力しますが、実行はしません。実際にコマンドを実行するには、省略してください。

スクリプトを 5 回実行する代わりに、 を使用grepして 5 つのパターンのいずれかを一度に検索します。

そして、あなたは使うべきです

cc=$(geoiplookup $IP)

バッククォートの代わりに; より安全です。

于 2013-07-16T10:41:13.333 に答える