2008年9月3日水曜日

(Code: sh) v5get

ロシアの某プロキシ販売サイトからサンプルプロキシリストを取得するシェルスクリプトです。
JavaScriptで少し難読化されてるためシェルが読める形に加工しています。
#!/bin/sh

PROG=`basename $0`

## check command
LIST="mktemp curl"
for CMD in $LIST ;do
TEST_CMD=`which $CMD`
if [ -z "$TEST_CMD" ] ;then
echo "$PROG: Error: we need command \"$CMD\"" >&2
exit 1
fi
done

## init
URL=http://www.checker.freeproxy.ru/checker/last_checked_proxies.php
KEY_SED='/Free SOCKS 5/,/Free <b>RUSSIAN/p'
DIR_TMP=`mktemp -d`
echo "dir tmp: $DIR_TMP" >&2
FILE_SRC=$DIR_TMP/src
FILE_NUM=$DIR_TMP/num
DIR_SCR=$DIR_TMP/scr
mkdir $DIR_SCR
FILE_RES=$DIR_TMP/res

## body
curl -Ss --compressed $URL |sed -n "$KEY_SED" >$FILE_SRC
grep -n 'script>' $FILE_SRC |awk -F: '{print $1}' >$FILE_NUM
N=`wc -l $FILE_NUM |awk '{print $1}'`
NUMS=(`cat $FILE_NUM`)
for ((i=0 ;i<$N ;i=$[$i + 2])) ;do
FILE_SCR=$DIR_SCR/$i
sed -n ${NUMS[$i]},${NUMS[$[$i + 1]]}p $FILE_SRC >$FILE_SCR
done

for FILE in `find $DIR_SCR -type f` ;do
IP=`grep 'name =' $FILE |sed "s/.*'\(.*\)'.*/\1/"`
NUM=`grep -n 'document' $FILE |awk -F: '{print $1}'`
NUM=$[$NUM - 1]
STR_EXP=`sed -n ${NUM}p $FILE`
STR_PORT=`echo $STR_EXP |sed 's/.*\(port[0-9]\+\).*/\1/'`
PORT_SEED=`grep "$STR_PORT =" $FILE |awk '{print $3}' |awk -F\; '{print $1}'`
STR_EXP_APD=`echo $STR_EXP |sed 's/.*\(+.*\);/\1/'`
echo $IP:$[$PORT_SEED $STR_EXP_APD] >>$FILE_RES
done

cat $FILE_RES
rm -r $DIR_TMP

実際にはこの出力を、さらに
・ホストが生きているか?
・ホスト名を逆引きできるか?
・302を返さないか?
といったことを調べるチェッカーにかけます。