必要な出力を生成するクールなスクリプトを作成しましたが、画面に表示されるだけなので、コピーしてからコマンドを貼り付けて実行する必要があります。これが私のスクリプトの短縮バージョンです。
#!/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このようにシェルウィンドウに:
/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のオプションがありませんか?
スクリプトを変更する必要のない簡単な方法は、コマンドの出力を別のbashインスタンスにパイプすることです。このような:
yourscript | bash -
-
は、bdinにstdinからコマンドを読み取る必要があることを伝えます。
ただし、迅速な解決策を探していない場合は、コマンドを動的に構築して実行することもできます。このような:
cmd="ls"
if [ "foo" != "bar" ] ; then
cmd="$cmd -a"
then
# ... and so on
# now execute it:
$cmd
eval
を使用して文字列を実行できます。
eval $cmdstring
次のようにコマンドを括弧で囲んでください:
echo $(ls)
コマンドの前にテキストを含めることもできます
echo "The date is $(date)"
例えば
echo "Enter Text Here $(Command Here)"
Bashビルトインevalがあり、これはシェルで入力されたようにコマンドを実行します。たとえば、スクリプト内で次のことができます。
eval $(echo -e $runc $IP $cc | grep Algeria)
これにより、サブシェルでエコーが処理され、シェルで入力した後にEnterキーを押したように出力が実行されます。
以下のbashマニュアルからの抜粋を参照してください。
eval [arg ...] argが読み取られ、連結されて1つのコマンドになります。このコマンドはシェルによって読み取られて実行され、その終了ステータスがevalの値として返されます。引数がない場合、または引数がnullのみの場合、evalは0を返します。
echo `pwd`
上記のコマンドは私のために動作します。
使用する grep -E
と代わりにパターン:
$runc $IP $cc | grep -E 'Algeria|Argentina|...'
説明:echo
はコマンドを出力しますが、実行しません。コマンドを実際に実行するには、単に省略します。
また、スクリプトを5回実行する代わりに、grep
を使用して、5つのパターンのいずれかを一度に検索します。
そして、使用する必要があります
cc=$(geoiplookup $IP)
バックティックの代わり。より安全です。