月次アーカイブ: 6月 2008

前回のこのエントリーの続きといいますか、シリーズになっちゃってる感が否めないですがw

珠玉のエロ画像でbashのお勉強です。井上和香、唇がエロくて大好きです。そんな (っ´∀`)っ ゃー が寝ながら画像getして翌朝ムフフと楽しみたいという動機で今回はワンライナーで連番のエロ画像を取得します。

今回のターゲットはココ。

ttp://intervalues6.com/w/waka.html
ttp://intervalues6.com/w/waka2.html
ttp://intervalues6.com/w/waka3.html
ttp://intervalues6.com/w/waka4.html

これらにリンクされている画像を普通にwgetで

$ for i in `echo {1..100}`; do sudo wget http://intervalues6.com/w/waka$i.jpg; done

なんてダウンロードしようと思ったのですが、ここのサーバはちゃんとリファラ対策をしています。
なので、wgetでリファラくっつけてダウンロードするには

$ for i in `echo {1..100}`; do wget --referer=http://intervalues6.com/w/waka.html http://intervalues6.com/w/waka$i.jpg; done

こうします。waka[2-4].htmlからリンクされている画像であっても、サーバサイドでは
「どこぞのドメインからのリファラを許可するか」しか見ていないので、すべてwaka.htmlからのリファラでいけます。なお、実際にダウンロードしてみるとわかるのですが、waka92.jpg以降が404なので、idol.htmlにリダイレクトされていますので、適宜これを削除します。

$ rm -f idol.html*

================================================================================
今日のワンポイント

wgetコマンドで画像直getできなかったら、同じドメインの適当なURL(存在するファイルで)で
リファラをくっつけてやろう
================================================================================

次に、curlコマンドで同じことをやってみます。curlコマンドの -e オプションで、リファラをくっつけてやります。-O オプションがないと、ファイルとして保存できません。

$ for i in `echo {1..100}`; do curl -e http://intervalues6.com/w/waka.html -O http://intervalues6.com/w/waka$i.jpg; done

さてこれだと

$ ls
waka100.jpg  waka18.jpg  waka26.jpg  waka34.jpg  waka42.jpg  waka50.jpg  waka59.jpg  waka67.jpg  waka75.jpg  waka83.jpg  waka91.jpg  waka9.jpg
waka10.jpg   waka19.jpg  waka27.jpg  waka35.jpg  waka43.jpg  waka51.jpg  waka5.jpg   waka68.jpg  waka76.jpg  waka84.jpg  waka92.jpg
waka11.jpg   waka1.jpg   waka28.jpg  waka36.jpg  waka44.jpg  waka52.jpg  waka60.jpg  waka69.jpg  waka77.jpg  waka85.jpg  waka93.jpg
waka12.jpg   waka20.jpg  waka29.jpg  waka37.jpg  waka45.jpg  waka53.jpg  waka61.jpg  waka6.jpg   waka78.jpg  waka86.jpg  waka94.jpg
waka13.jpg   waka21.jpg  waka2.jpg   waka38.jpg  waka46.jpg  waka54.jpg  waka62.jpg  waka70.jpg  waka79.jpg  waka87.jpg  waka95.jpg
waka14.jpg   waka22.jpg  waka30.jpg  waka39.jpg  waka47.jpg  waka55.jpg  waka63.jpg  waka71.jpg  waka7.jpg   waka88.jpg  waka96.jpg
waka15.jpg   waka23.jpg  waka31.jpg  waka3.jpg   waka48.jpg  waka56.jpg  waka64.jpg  waka72.jpg  waka80.jpg  waka89.jpg  waka97.jpg
waka16.jpg   waka24.jpg  waka32.jpg  waka40.jpg  waka49.jpg  waka57.jpg  waka65.jpg  waka73.jpg  waka81.jpg  waka8.jpg   waka98.jpg
waka17.jpg   waka25.jpg  waka33.jpg  waka41.jpg  waka4.jpg   waka58.jpg  waka66.jpg  waka74.jpg  waka82.jpg  waka90.jpg  waka99.jpg

おや?実は100個jpgがあった?

$ for i in `echo {90..100}`
> do
> file waka$i.jpg
> done
waka90.jpg: JPEG image data, JFIF standard 1.01
waka91.jpg: JPEG image data, JFIF standard 1.01
waka92.jpg: HTML document text
waka93.jpg: HTML document text
waka94.jpg: HTML document text
waka95.jpg: HTML document text
waka96.jpg: HTML document text
waka97.jpg: HTML document text
waka98.jpg: HTML document text
waka99.jpg: HTML document text
waka100.jpg: HTML document text

はい、やっぱりwaka92.jpg以降は404でリダイレクトされた後のhtmlファイルを拾ってきています。それでは、92から100までのファイルを削除したいのですが、ここではfileコマンドでJPEGじゃないファイルを拾って削除することにします。

$ for i in `ls`; do for f in `file $i | grep -v "JPEG image data" | awk '{print $1}' | sed s/:$//g`; do rm -f $f; done; done

これでOKです。for文の入れ子で、削除するファイルを指定してやります。外側のfor文は、カレントディレクトリ全体をlsし、内側のfor文で、うそんこJPEG(拡張子は.jpgなんだけど中身がJPEGじゃない)なデータをとっ捕まえて、出力結果をawkとsedで整形し、削除してやります。

上記の例だと、たまたま92から100まで連続してうそんこJPEGだってわかってるからいいようなものの、連番のファイルじゃなかったり、連番のファイルであっても、飛び飛びにうそんこJPEGが混じっているようなときに楽してファイル整理をすることができます。

ね、簡単でしょ?

履歴書書いたりするときに「あれー、2000年って平成何年だっけ?」とか、100年前って和暦で言うところの何年なんだ?と「ふ」とした疑問がわいたりすることがあるでしょう。

そんなあなたに、wareki.shを作りました。

※ ブログに書いたときにダブルクォートなどがサニタイズされてしまったので、再度UPしました。


#!/bin/sh

LANG=ja_JP.utf8
case $1 in
[0-9]*) date +%Ec --date=$1'years ago' | cut -b 1-22
| sed -e "s/年[0-1][0-9]月[0-3][0-9]日/年/g;s/$/t西暦$(LANG=C date +%Y --date=$1'years ago')年/g"
| sed s/年 [1-3]/年't'/g ;;
[[:alpha:]]) echo "USAGE $0 1";;
esac

最初に端末を日本語UTF-8環境にしていますが、EUC-JPな環境の人は、ここを書き換えてください。また、和暦の右側に西暦を表示することで、和暦と西暦の対応が見やすくなっています。

使い方はいたって簡単、wareki.shのあとに、引数として正の整数を与えてやってください。今年の値を出す場合は、0を与えます。たとえば・・・

$ wareki.sh 10
平成10年        西暦1998年
$ wareki.sh 100
明治41年        西暦1908年

とまあ、こんなあんばいです。なお、CentOS4.xでは和暦は明治35年以降が表示されます。今年から100年前までの一覧表を出すには

$ for i in `echo {0..100}`; do ~/bin/wareki.sh $i; done

これでOKです。
ね、簡単でしょ?

blogcubeが収容されているサーバですが、データセンター移設のため、以下の日程でサーバ停止します。

----------------------------------------------

■ 移設スケジュール ■
----------------------------------------------

期日    2008年 7月6日(日)
時間    午前1時30分から午前7時の間(予定)

ご迷惑をおかけいたしますが、よろしくお願いいたします。

ntopとは、各種プロトコルの情報やホストごとの送受信パケット数/データ量やスループットの他、トラフィックの時間経過グラフ、ホスト間の通信データ量などをブラウザでわかりやすく表示してくれるソフトです。コンソールからも使えるようですが、目に見えてわかりやすいのは、ブラウザに表示されるグラフでしょう。

インストール後の設定については、
http://www.geocities.jp/i_catnap/Diary/Diary-0404.html
を参考にしました。

ただインストールしても動くのですが、LAN内を流れるパケットをモニターする関係上、誰にでもグラフを見せていいか?・・・となると、ちょっと疑問が残ります。ntopそのものはユーザによるアクセス制限(見せたいデータの権限を指定)がありますが、ntopへのそもそものアクセスを、限られたユーザだけにしたいなー・・・という思いもあったりします。なので、

ntopを動かす(待ち受ける)インターフェイスはeth0
ntopにアクセスできるノードはeth0の属するサブネット(192.168.0.0/24)のみ
ntopの画面にはiptablesを使って直アクセスさせず、一度apacheのmod_proxyを介して、ベーシック認証を通過させる

ユーザがntopの画面を見るまでには、以下のステップを踏むことになります。

[パソコンのブラウザ] → [apache (ベーシック認証、mod_proxyによるリバースプロキシ)] → [ntop]

また、ユーザは http://192.168.0.3/ にアクセスしてユーザ名とパスワードを聞かれることを意識するくらいで使うことができますし、使わせる側としても、不必要に裏側でどう動いているかを見せなくてすむというメリットがあります。

■■ インストール

インストールした環境は以下のとおりです。

----------------------------------------------------------------------------------------------------------------------------------------------------------------
sh-3.00$ hostname
intra1.example.com

sh-3.00$ cat /etc/redhat-release
CentOS release 4.6 (Final)

sh-3.00$ uname -a
Linux intra1.example.com 2.6.9-67.0.15.EL #1 Thu May 8 10:39:19 EDT 2008 i686 i686 i386 GNU/Linux
----------------------------------------------------------------------------------------------------------------------------------------------------------------

ntopのパッケージはrpmforgeリポジトリにあるので、ここからインストールします。

[root@intra1 ~]# yum --enablerepo=rpmforge install ntop
(中略)
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 ntop                    i386       3.3-1.el4.rf     rpmforge          3.4 M
Installing for dependencies:
 net-snmp-libs           i386       5.1.2-11.el4_6.11.2  update            1.7 M

Transaction Summary
=============================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 5.2 M
Is this ok [y/N]: y

■■ 設定

■ ntop.conf 編集

[root@intra1 ~]# cd /etc/
[root@intra1 etc]# cp -p ntop.conf ntop.conf.orig
[root@intra1 etc]# vi ntop.conf

 ・ ログの出力先を変更する

ここを
### Logging messages to syslog (instead of the console):
###  NOTE: To log to a specific facility, use --use-syslog=local3
###  NOTE: The = is REQUIRED and no spaces are permitted.
--use-syslog

こうする
### Logging messages to syslog (instead of the console):
###  NOTE: To log to a specific facility, use --use-syslog=local3
###  NOTE: The = is REQUIRED and no spaces are permitted.
#--use-syslog
--use-syslog=local3

※ syslogのファシリティに空きがあるかどうか(local3が使われていないか)を/etc/syslog.confを見て確認すること

 ・ ntopがローカルとみなすネットワークを設定する

ここを
### Sets the networks that ntop should consider as local.
###  NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
###        The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy

こうする
### Sets the networks that ntop should consider as local.
###  NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
###        The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy
--local-subnets 192.168.0.0/24

 ・ ntopをデーモンモードで動かす

ここを
### Sets program to run as a daemon
###  NOTE: For more than casual use, you probably want this.
#--daemon

こうする
### Sets program to run as a daemon
###  NOTE: For more than casual use, you probably want this.
#--daemon
--daemon

以上を確認して保存します。

■ スタートスクリプトの編集

/etc/init.d/ntopを編集して、eth0のIPアドレスでのみlistenするようにします。
まずはifconfigコマンドでeth0のIPアドレスを確認しましょう。

sh-3.00# ifconfig eth0 | grep "inet addr"
          inet addr:192.168.0.3  Bcast:192.168.0.255  Mask:255.255.255.0

eth0に割り当てられているIPアドレスは192.168.0.3です。

sh-3.00# cd /etc/init.d
sh-3.00# cp -p ntop ntop.orig
sh-3.00# vi ntop

ここを
start () {
        echo -n $"Starting $prog: "
        daemon $prog -d -L @/etc/ntop.conf
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}

こうする
start () {
        echo -n $"Starting $prog: "
        #daemon $prog -d -L @/etc/ntop.conf
        daemon $prog -d -w 192.168.0.3:3000 -L @/etc/ntop.conf
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}

スタートスクリプト
からntopを起動するときのオプションは以下のとおりです。

-d = デーモンモードとして動かす
-w 192.168.0.3:3000 = IPアドレス192.168.0.3のポート3000番で待ち受ける
-L = 標準出力のかわりにsyslogへメッセージを送る
@/etc/ntop.conf = /etc/ntop.conf を設定ファイルとする

■ syslog.conf編集

[root@intra1 etc]# cp -p syslog.conf syslog.conf.20080616
[root@intra1 etc]# vi syslog.conf

ここを
*.info;mail.none;authpriv.none;cron.none;local1.none                   /var/log/messages

こうする
#*.info;mail.none;authpriv.none;cron.none;local1.none                   /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none        /var/log/messages

そして下記を追加する
local3.*                                                                /var/log/ntoplog

■■ syslogdをreloadする

[root@intra1 etc]# /etc/init.d/syslog reload
Shutting down kernel logger:                               [  OK  ]
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
Starting kernel logger:                                    [  OK  ]

■■ ntopのログローテーション設定を行う

お好みでログローテーションの設定を変更します。
(っ´∀`)っ ゃー はログを読むためだけにrootになったりするのがイヤなので、
(っ´∀`)っ ゃーが普段使うユーザ「oresama」はwheelグループに入れています。
で、読みたいログはwheelグループに読み込みの権限を与えています。

[root@intra1 etc]# cd logrotate.d/
[root@intra1 logrotate.d]# vi ntop

ここを
/var/log/ntop.access.log {
        missingok
        postrotate
                /sbin/service ntop condrestart >/dev/null 2>&1
        endscript
}

こうする
/var/log/ntoplog {
        daily
        rotate 365
        compress
        ifempty
        create 0640 root wheel
        missingok
        postrotate
                /sbin/service ntop condrestart >/dev/null 2>&1
        endscript
}

■■ 初期設定

ntopを最初に動かす前に、ntopの管理ユーザ「admin」のパスワードを設定します。
これは、ntopの細かい設定をブラウザから行うときに使います。

[root@intra1 logrotate.d]# cd
[root@intra1 ~]# /usr/bin/ntop
(しばらくログが流れた後)
ntop startup - waiting for user response!

Please enter the password for the admin user:
Please enter the password again:

というプロンプトが出るので、パスワードを入力し、しばらくしてからCtrl+Cで終了させます。

■■ 起動

■ スタートスクリプトからの起動

[root@intra1 ~]# /etc/init.d/ntop start
Starting ntop:                                             [  OK  ]

[root@intra1 ~]# /etc/init.d/ntop status
ntop (pid 559) is running...

■ 自動起動設定

[root@intra1 ~]# chkconfig ntop --list
ntop            0:off   1:off   2:off   3:off   4:off   5:off   6:off

[root@intra1 ~]# chkconfig ntop on

[root@intra1 ~]# chkconfig ntop --list
ntop            0:off   1:off   2:on    3:on    4:on    5:on    6:off

■■ ブラウザから見てみる

http://192.168.0.3:3000/

グラフはあっさり表示されます。

ユーザ名:admin
パスワード:(さっき指定したやつ)

■■ ベーシック認証を使えるようにする

ntopの認証機能は、画面の一部を見せたり見せなかったりするようですが、
そもそもグラフそのものにアクセスさせたくないっていう場合には、
次の仕組みを使うことによってベーシック認証を実現することができます。

1) 192.168.0.3 をntop専用のバーチャルホストとして、一度apacheで接続を待ち受け、apacheのリバースプロキシを使ってntopへ要求を投げる
2) iptablesでポート3000番をlocalhostにだけ許可する
3) ベーシック認証をかける

■ 1 apacheで192.168.0.3をntop専用のバーチャルホスト設定する

apacheでmod_proxyが使えるかどうか、以下の記述がhttpd.confにあるか確認してください。

LoadModule proxy_module modules/mod_proxy.so

それでは設定です。

sh-3.00# cd /etc/httpd/conf.d
sh-3.00# vi ntop.conf

NameVirtualHost 192.168.0.3:80

    # サーバー名の指定をする
    ServerName intra1.example.com
    # エラーログの定義
    ErrorLog /home/oresama/logs/intra1_error.log
    # アクセスログの定義
    CustomLog /home/oresama/logs/intra1_access.log combined
    # フォワードプロキシをoffにする
    ProxyRequests Off
    # リモートサーバをローカルサーバのURL空間にマップする。
    # ここでは、/にアクセスすると、http://192.168.0.3:3000/にマップする。
    ProxyPass / http://192.168.0.3:3000/

    < br />        # ベーシック認証に使うファイルを定義する
        AuthUserFile /home/oresama/auth/.htpasswd
        AuthGroupFile /dev/null
        AuthName "User Admin"
        AuthType Basic
        require valid-user
        # 外部からの接続を拒絶し、LAN内からのアクセスのみ許可する
        Order deny,allow
        Deny from all
        Allow from 192.168.0.0/24
   

■ 設定反映

sh-3.00# apachectl configtest
sh-3.00# apachectl graceful

■ iptablesでポート3000番をlocalhostだけにする

sh-3.00# iptables -L -n | grep 3000
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0           tcp dpt:3000

■ ベーシック認証をかける

sh-3.00# htpasswd -c /home/oresama/auth/.htpasswd oresama
New password:
Re-type new password:
Adding password for user oresama

sh-3.00# cat /home/oresama/auth/.htpasswd
oresama:n8H0Vb.JKkuRA

■ 確認

http://192.168.0.3/
にアクセスして、ベーシック認証がかかること

http://192.168.0.3:3000/
にアクセスして、接続ができないこと

以上で、LAN内を流れるパケットをモニターすることができました。
ね、簡単でしょ?