木曜日, 11月 18, 2010

ファイルサイズの集計

カレントディレクトリ以下のファイルサイズの集計

$ find . -type f -printf "%s\n" | perl -nle 'BEGIN{my $sum = 0;} $sum += $_; END{print $sum;}'

awkで書くと

$ find . -type f -printf "%s\n" | awk '{ sum += $1; }; END { printf "%d\n", sum }'

木曜日, 9月 09, 2010

RootKit Hunterのインストール(CentOS)

CentOS 5.5にRootKit Hunterをインストールする。

rpmbuildコマンドがなければ、はじめにインストールする。

$ su
Password:
# yum install rpm-build

rkhunterのソースコードをダウンロードし、RPMパッケージを作成する。

# wget http://sourceforge.net/projects/rkhunter/files/rkhunter/1.3.6/rkhunter-1.3.6.tar.gz/download
# rpmbuild -ta rkhunter-1.3.6.tar.gz

作成されたRPMパッケージをインストールする。

# cd /usr/src/redhat/RPMS/noarch
# rpm -ivh rkhunter-1.3.6-1.noarch.rpm

rkhunterの使いかたは

# rkhunter -c

以上

月曜日, 9月 06, 2010

戻って来ました

今までメインで使っていたVoxが今月末でサービス終了だそうで。
戻って来ました。

セマフォがいっぱいでApacheが起動しない

2010/05/19perlfreak.vox.comより転載)
そんなときは

#!/bin/sh

for semid in `ipcs -s | grep apache | cut -d' ' -f2`; do
if ipcrm -s $semid; then
true
fi
done

を適当な名前で保存して実行権限をつけ、スーパーユーザで実行。

特定のプロセスをまとめてkill

2010/05/10perlfreak.vox.comより転載)
例えば、swatchのプロセスをまとめて強制終了したい場合

# ps ax | grep /usr/bin/swatch | awk '{print $1}' | xargs kill -KILL

Perlワンライナー:.batファイルでドラッグ&ドロップ

2010/04/30perlfreak.vox.comより転載)
例えばPerlがインストールされているWindowsでつぎの行を hoge.bat というファイル名で保存する。

for %%a in (%*) do perl -i.bak -ne "if (/^hoge_/) {print;}" %%a

hoge.bat に処理対象のテキストファイルをドラッグ&ドロップすると、処理前の内容は元ファイルに「.bak」がついたファイルにバックアップされ、元のファイルは行の先頭が「hoge_」の行のみ出力されたものになる。
便利。

OpenLDAPの検索

2010/04/02perlfreak.vox.comより転載)
slapdが動いているマシン上でスーパーユーザになり

# ldapsearch -x -b "dc=hoge,dc=co,dc=jp" -s sub "(cn=taro_yamada)"


のようにコマンドを実行する。

Postfixでキューの入れ直し

2010/04/20perlfreak.vox.comより転載)
main.cfを変更した場合等、キューが溜まったままになることがある。
その場合、キューに入れ直すとうまくいく可能性がある。
すべてのキューを入れ直す場合

# postsuper -r ALL


さらにキューに溜まったメールをすぐ処理させる場合

# postqueue -f

以上

yumなLinuxでRPMパッケージのダウンロード

2010/03/16perlfreak.vox.comより転載)
yum-utils というパッケージに含まれる yumdownloader というコマンドを使う。

Perlワンライナー:ファイル名一括置換

2010/02/24perlfreak.vox.comより転載)
同一ディレクトリ内のファイルの拡張子「.txt」を「.sql」に置換する例。

$ find . -name \*\.txt | perl -nle '$o=$_;s/\.txt$/\.sql/;rename $o,$_'

Perlワンライナー:ファイル内の特定文字列を置換

2010/02/18perlfreak.vox.comより転載)
ファイル hoge.txt 内の特定文字列「foo」を「bar」に置換する場合

$ perl -i.bak -pe 's/foo/bar/' /tmp/hoge.txt


のように実行する。

-i.bak

オプションをつけると

hoge.txt.bak

というファイル名でバックアップが作成される。

Linux: パスワードの有効期間設定

2010/02/23perlfreak.vox.comより転載)
ユーザ hoge のパスワードの有効期間を90日、変更催促を14日前にする場合

$ su -

Password:
# chage -M 90 -W 14 hoge

Perlワンライナー:特定のアドレスを含むメールファイル

2010/02/17perlfreak.vox.comより転載)
1メール1テキストファイルとして、メールファイルのあるディレクトリで

$ perl -0777 -ne 'split(/\n\n/, $_);print $ARGV . "\n" if ($_[0] =~ /\nFrom: (.+?)\n[A-Z]/ism and $1 =~ /hoge@foo\.bar/ism)' *


を実行すると、From: に hoge@foo.bar を含むファイル名が出力される。
perlコマンドのオプション「-0777」は、標準入力からのデータを改行で分割して読み込まない。

split(/\n\n/, $_);

は、標準入力から一気に読み込んだデータを空行で分割して無名配列に格納している。
その最初の要素がメールヘッダーになる。
正規表現は、From: が複数行になる場合を考慮。

Perlワンライナー:特定パターン文字列を含むファイル

2010/02/12perlfreak.vox.comより転載)
同一ディレクトリ内のファイルで、特定パターンの文字列を含むファイルのファイル名をリストアップ。

$ perl -nle 'print $ARGV if (/正規表現/)' *

安直なGumblar改ざんチェック

2010/01/18perlfreak.vox.comより転載)

Webサーバのドキュメントルートが /var/www/html だとして


# cd /var/www/html
# find . -type f -print0 | xargs -0 egrep -l "/\*GNU GPL\*/ try|

vsftpdのFTPES対応設定

2010/01/18perlfreak.vox.comより転載)

Red Hat Enterprise Linux 4 ES で vsftpd が稼働している前提。


# cd /usr/share/ssl/certs
# make vsftpd.pem
(質問に答えて入力)

# cd /etc/vsftpd
# vi vsftpd.conf
(最後に以下を追加する)
ssl_enable=YES
ssl_tlsv1=YES
allow_anon_ssl=NO
force_local_logins_ssl=NO
force_local_data_ssl=NO
rsa_cert_file=/usr/share/ssl/certs/vsftpd.pem

FTPESのみ許可したい場合は、

force_local_logins_ssl=YES
force_local_data_ssl=YES

とする。
ファイアウォール等でうまくいかない場合は、

pasv_enable=YES
pasv_address=123.456.789.012

のようにサーバマシンのグローバルIPアドレスを指定する。
さらにそれでもうまくいかない場合、クライアント環境のファイアウォールの可能性があるので

pasv_min_port=30000
pasv_max_port=30500

のようにdestinationに対して開いているポート番号を指定する。

# service vsftpd restart

クライアントソフトは FileZilla を使う。
メニューの「ファイル」->「サイトマネージャ」を開き、該当サイトを選択して、サーバの種類を「FTPES」にする。
初回接続時は、証明書に関するダイアログが表示される。


以上

ClamAVのシグネチャ確認

2010/01/13perlfreak.vox.comより転載)

$ sigtool -l

これで対応しているウィルスがわかる。
例えば、Gumblarに対応しているかどうかは

$ sigtool -l | grep Gumblar

とすればよい。


以上

RHEL4 up2date -> CentOS4 yum

2009/11/19perlfreak.vox.comより転載)

Red Hat Enterprise Linux 4.8 のRPMパッケージの更新を Red Hat のリポジトリを参照する up2date コマンドから CentOS 4.8 のリポジトリを参照する yum コマンドで行えるよう変更する。

$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/centos-release-4-8.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/python-elementtree-1.2.6-5.el4.centos.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/python-sqlite-1.1.7-1.2.1.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/python-urlgrabber-2.9.8-2.noarch.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/sqlite-3.3.6-2.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/yum-metadata-parser-1.0-8.el4.centos.i386.rpm
$ wget http://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/yum-2.4.3-4.el4.centos.noarch.rpm
$
$ su
Password:
#
# rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-4
#
# rpm -ivh --force centos-release-4-8.i386.rpm
#
# rpm -ivh python-elementtree-1.2.6-5.el4.centos.i386.rpm \
python-sqlite-1.1.7-1.2.1.i386.rpm \
python-urlgrabber-2.9.8-2.noarch.rpm \
sqlite-3.3.6-2.i386.rpm \
yum-metadata-parser-1.0-8.el4.centos.i386.rpm \
yum-2.4.3-4.el4.centos.noarch.rpm

あとは

# yum check-update
# yum update

でRPMパッケージを更新。
デフォルトの設定で kernel 関連パッケージは上書きしないでインストールされるようになっているが、kernel 関連パッケージを更新対象から除外したい場合は

/etc/yum.conf

の [main] に

exclude=kernel*

を追記する。


以上

Perlモジュールのインストールでperllocal.podへ記録をしない方法

2010/01/04perlfreak.vox.comより転載)

Perlモジュールのインストールは

$ perl Makefile.PL
$ make
$ make test
$ su
Password:
# make install

とするが、perllocal.podファイルにインストール記録をしないようにするには最後の1行を

# make pure_install

とすればよい。
checkinstallでPerlモジュールのRPMパッケージを作成する際、これを忘れるとパッケージのインストールのときにperllocal.podが重複してインストールできなくなる。


以上

Squid でブラウザによるアクセス制限

2009/10/27perlfreak.vox.comより転載)

プロキシサーバ(Squid)にアクセスしてきたブラウザがIEの6か7だったらOKにする場合、
/etc/squid/squid.conf に

acl msie browser -i MSIE.(6|7)\.0
http_access deny !msie

のように記述し、squid のサービスを再起動する。
この際、エラーメッセージをカスタマイズする場合は、/etc/squid/squid.conf に

acl msie browser -i MSIE.(6|7)\.0
deny_info ERR_BROWSER_DENIED msie
http_access deny !msie

のように記述し、エラーメッセージ用ディレクトリに ERR_BROWSER_DENIED というファイルを置く。
Debian の場合、エラーメッセージ用ディレクトリは

/usr/share/squid/errors/English


以上

Nagios の Web画面で設定変更できないとき

2009/09/10perlfreak.vox.comより転載)

OSがRed Hat Enterprise LinuxでRPMパッケージでNagiosをインストールしている前提

# vi /etc/init.d/nagios

start) のところの

echo "done."

の前に

chmod o+w $NagiosCommandFile

という行を追加する。

# service nagios restart


以上

Tripwire でレポートメールが送られるようにする

2009/08/21perlfreak.vox.comより転載)

/etc/tripwire/twpol.txt

の @@section GLOBAL のところに

MAILADDRESS="foo@hoge.com";

のように追記し、ポリシーの記述部分全体を

( emailto = $(MAILADDRESS) )
{

(ポリシー記述部分)

}

のように囲む。
最後に

# /usr/sbin/twadmin -m P -S site.key twpol.txt

Tripwire の定時チェック

2009/08/21perlfreak.vox.comより転載)

例えば、/usr/local/sbin に

#!/bin/sh

/usr/sbin/tripwire --check --email-report
/usr/sbin/tripwire --init -P XXXXXXXX

のようなシェルスクリプトを tripwire.sh という名前で作成して実行権限を与え、スーパーユーザの crontab で

0 3 * * * /usr/local/sbin/tripwire.sh > /dev/null 2>&1

のように設定する。
※ XXXXXXXX はTripwireインストール時に設定したローカルパスフレーズ。

Tripwireのインストール

2009/08/20perlfreak.vox.comより転載)

1. ソースからRPMファイル作成

http://sourceforge.net/projects/tripwire/files/

からソースファイルをダウンロード。
展開したディレクトリに移動し

$ ./configure --prefix=/usr --sysconfdir=/etc/tripwire
$ vi install/install.cfg

(途中略)

#TWDB="/${prefix}/lib/tripwire"
TWDB="/var/lib/tripwire"

(途中略)

#TWMAILMETHOD=SENDMAIL

#####################################
# SMTP options
#
# TWSMTPHOST selects the SMTP host to be used to send reports.
# SMTPPORT selects the SMTP port for the SMTP mail program to use.
#####################################

TWMAILMETHOD=SMTP
TWSMTPHOST="localhost"
TWSMTPPORT=25

(途中略)

$ make
$ su
Password:

# checkinstall --fstrans=no -R "make install"


2. インストール

# rpm -ivh tripwire-2.4.1.2-el4.i386.rpm
# mkdir /var/lib/tripwire /var/lib/tripwire/report


3. 設定ファイル(/etc/tripwire/twcfg.txt)変更

# /usr/sbin/twadmin -m F -c tw.cfg -S site.key twcfg.txt


4. ポリシーファイル(/etc/tripwire/twpol.txt)変更

# /usr/sbin/twadmin -m P -S site.key twpol.txt


5. 初期化

# /usr/sbin/tripwire --init

※5でエラーが出たら、3または4からやり直し。

WindowsでCPU使用率をみるコマンド

2009/06/17perlfreak.vox.comより転載)

typeperf -sc 10 -si 1 "\Processor(_Total)\% Processor Time"

scは回数、siは間隔(秒)。

Rhinoで実行スクリプト

2009/05/18perlfreak.vox.comより転載)

Rhinoはじめ、必要なJARファイルにCLASSPATHはとおっている前提。
Javaが /usr/local/java にインストールされているとして、つぎの内容を例えばsample.jsとして保存し、実行権限をつける。

----- (sample.js ここから) -----
#!/usr/local/java/bin/java org.mozilla.javascript.tools.shell.Main

importPackage( java.lang );
importPackage( java.sql );

var db_host = arguments[0];
var db_name = arguments[1];
var driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
var url = "jdbc:sqlserver://" + db_host + ":1433;DatabaseName=" + db_name;
var user = "user";
var passwd = "passwd";
var sql = "SELECT site_id FROM sites WITH (NOLOCK)";

Class.forName( driver );
var conn = DriverManager.getConnection( url, user, passwd );
var stmt = conn.createStatement();
var rs = stmt.executeQuery(sql);

while ( rs.next() ) {
print( rs.getString( "site_id" ) );
}

conn.close();
----- (sample.js ここまで) -----

そして

$ ./sample.js db_host db_name

のように実行する。
上の例は、MSのJDBCドライバを使ってSQL Serverに問い合わせている。
実行時の引数は、「arguments」という配列で取得可能。
起動はJRubyより速いかも。

以上

Postfix 自ホストでunknown userになるメールを他へ転送

2009/05/15perlfreak.vox.comより転載)

    同一ドメイン(hoge.com)内の他のマシン(192.168.1.1)のaliasesに

    foo: bar@hogehoge.com

    という転送設定の記述があるが、自ホストのaliasesにはfooの記述もなく、fooというユーザもない場合、自ホストから

    foo@hoge.com

    宛てにメールを送るには、main.cf につぎの2行を追加して再起動。

    fallback_transport = smtp:[192.168.1.1]
    local_recipient_maps =

    これは、自ホストでunknown userになるメールを他へ転送する設定。

    以上


digコマンドで逆引きの確認

2009/05/14perlfreak.vox.comより転載)

割り当てられたグローバルIPアドレスが、123.456.789.0/28の場合に123.456.789.12を引く前提。

$ dig @ns.hoge.jp -x 123.456.789.12

これで引けない場合

$ dig @ns.hoge.jp ptr 12.0/28.789.456.123.in-addr.arpa.

PHPでSSH

2009/02/09perlfreak.vox.comより転載)

OSは、Red Hat Enterprise Linux ES 4 (32bit) が前提。

http://dag.wieers.com/rpm/packages/libssh2/

から

libssh2-0.17-1.el4.rf.i386.rpm
libssh2-devel-0.17-1.el4.rf.i386.rpm

を取得してインストール。

http://pecl.php.net/package/ssh2

から

ssh2-0.11.0.tgz

を取得し、そのファイルのあるディレクトリで

# pear install ./ssh2-0.11.0.tgz
# chmod 755 /usr/lib/php4/ssh2.so

すでにユーザfooがssh接続できるとして

# mkdir /etc/httpd/.ssh
# cp /home/foo/.ssh/* /etc/httpd/.ssh
# chown -R apache:apache /etc/httpd/.ssh
# chmod 700 /etc/httpd/.ssh

そして、

/etc/php.ini

extension=ssh2.so

という行を追加する。
最後にApacheを再起動する。
以上。

suEXEC

2008/10/28perlfreak.vox.comより転載)

Apache の httpd.conf に

SuexecUserGroup foo foo

というディレクティブを追加する。foo は、そのマシンのログインアカウント。

# service httpd restart

cgi-bin ディレクトリの下に bar というディレクトリを作成し、

# chown foo:foo bar
# chmod 701 bar

bar の下に hoge.cgi を置き

# chown foo:foo bar/hoge.cgi
# chmod 700 bar/hoge.cgi

hoge.cgi から呼び出すプログラムは

/usr/local/bin

に置く。

suEXEC下でのnagios

2008/12/29perlfreak.vox.comより転載)

suEXECの設定をしたApacheでは、nagiosのWebツールがうまく動作しない。
そこで、nagiosのCGIのファイルをApacheのCGIのディレクトリ下にコピーし、設定を変更する。

/etc/httpd/conf/httpd.confに

SuexecUserGroup foo foo

という記述があるとして

# mkdir /var/www/cgi-bin/nagios
# cp /usr/lib/nagios/cgi/*.cgi /var/www/cgi-bin/nagios
# chown -R foo:foo /var/www/cgi-bin/nagios
# chmod 701 /var/www/cgi-bin/nagios
# chmod 700 /var/www/cgi-bin/nagios/*.cgi
# vi /etc/httpd/conf.d/nagios.conf

 #ScriptAlias /nagios/cgi-bin "/usr/lib/nagios/cgi"
 ScriptAlias /nagios/cgi-bin "/var/www/cgi-bin/nagios"

 #
 

 (以下省略)

以上

Perl CGI::Application::Plugin::ValidateRMをcpanでインストール

2008/08/28perlfreak.vox.comより転載)

テストでこけてインストールできないので、

http://osdir.com/ml/lang.perl.modules.cgi-appplication/2007-09/msg00040.html

を参考に

~./.cpan/build/CGI-Application-Plugin-ValidateRM-2.2/t/forward.t

をつぎのように変更する。

===(ここから)===
use Test::More tests => 4;
use strict;

$ENV{CGI_APP_RETURN_ONLY} = 1;

{ package MyForward::Test; use base 'CGI::Application'; use
CGI::Application::Plugin::ValidateRM;

sub setup { my $self = shift; $self->start_mode('legacy_process');
$self->run_modes([qw/legacy_process legacy_form/]); }

sub legacy_form { my $self = shift;
Test::More::is($self->get_current_runmode, 'legacy_process', "if
::Forward is not loaded, current_rm is not updated");
# $self->header_type('none'); return "legacy form output HUH"; }
$self->header_type('none');
return ($HTML::FillInForm::VERSION <= 1.06) ? "legacy form output HUH" : "legacy form output"; }


sub legacy_process { my $self = shift; my ($results, $err_page) =
$self->check_rm('legacy_form', { required => 'fail' }); return
$err_page if $err_page; return 'legacy process completed'; }

my $app = MyForward::Test->new(); my $out = $app->run();
Test::More::is($out, 'legacy form output', "form is returned");
}

SKIP: {
package MyForward::TestForward;
use base 'CGI::Application';
use CGI::Application::Plugin::ValidateRM;
eval { require CGI::Application::Plugin::Forward; };
if ($@) {
Test::More::skip "CGI::Application::Plugin::Forward required", 2;
}

sub setup {
my $self = shift;
$self->start_mode('forward_process');
$self->run_modes([qw/forward_process forward_form/]);
}

sub forward_form {
my $self = shift;
Test::More::is($self->get_current_runmode, 'forward_form',
"if ::Forward is loaded, current_rm is updated");
$self->header_type('none');
# return "forward form output HUH";
return ($HTML::FillInForm::VERSION <= 1.06) ? "forward form output HUH" : "forward form output"; }

sub forward_process {
my $self = shift;
my ($results, $err_page) = $self->check_rm('forward_form', { required => 'fail' });
return $err_page if $err_page;
}

my $app = MyForward::TestForward->new();
my $out = $app->run();
Test::More::is($out, 'forward form output', "form is returned");
}
===(ここまで)===

そして

# make test
# make install

PersistentPerl

2008/08/28perlfreak.vox.comより転載)

Perlスクリプトをメモリに常駐させることができる。

http://daemoninc.com/PersistentPerl/
http://perldoc.jp/docs/modules/PersistentPerl-2.21/PersistentPerl.pod

インストールした後、Perlスクリプトの先頭行を

#!/usr/bin/perperl -w

のように変更するだけ。

Perl 更新日付が指定日数より前のファイルを圧縮

2008/08/05perlfreak.vox.comより転載)

OSの文字コードがUTF-8のLinux上のSambaサーバで管理しているディレクトリ下のファイルが対象。

===(compress_files.pl ここから)===
#!/usr/bin/perl -w

use File::Find::Rule;
use Encode qw/ from_to /;
#use warnings;
use strict;

# 処理対象ディレクトリパスと日数
my $dir_path = $ARGV[0] if $ARGV[0];
my $days = $ARGV[1] if $ARGV[1];
unless ( $days ) { exit; }

# 指定日数分前のtime
my $days_before = time - 60 * 60 * 24 * $days;

# ログ
my $log_path = '/tmp/compress_files.log';
system( "/usr/bin/touch", $log_path ) unless ( -e $log_path );

# 対象ファイルのパスを取得
my @files = File::Find::Rule->file()
->mtime( "<$days_before" ) ->in( $dir_path );

# 圧縮・削除処理
open OUT, ">> $log_path" or die "Cannot open file: $!\n";
foreach my $file_path ( @files ) {
if ( $file_path =~ /.+\.zip$/ ) { next; }

my $compress_path = $file_path . '.zip';

if ( $file_path =~ /^(.+)\/(.+?)$/ ) {
print $file_path . "\n";
print OUT $file_path . "\n";
my $dir_path = $1;
my $file_name = $2;
my $cp_file_name = $file_name;
from_to( $cp_file_name, 'utf8', 'cp932' );
my $compress_name = $file_name . '.zip';
chdir $dir_path;
system( "/bin/cp", "-p", $file_name, $cp_file_name );
my( $owner, $group, $date, $time ) = (split( / /, `/bin/ls -l $file_name`))[2,3,5,6];
my( $year, $mon, $day ) = split( /-/, $date );
my( $hour, $min ) = split( /:/, $time );
system( "/usr/bin/zip", $compress_name, $cp_file_name );
system( "/bin/chown", "$owner:$group", $compress_name );
system( "/usr/bin/touch", "-m", "-t", "$year$mon$day$hour$min", $compress_name );
system( "/bin/rm", $file_name, $cp_file_name );
}
}
close OUT;

exit;
===(compress_files.pl ここまで)===