読者です 読者をやめる 読者になる 読者になる

Perlを使ったちょっとしたファイルチェックスクリプト

Linuxで環境構築をする際に、権限やパーミッションのチェックをする事が多く、
地味に面倒だったので、簡単なチェックツールを作ってみました。


構成管理ツールが使えない場面などで役に立つかも?

スクリプト

Perlを使って書いてみました。

#!/usr/bin/perl -w
use strict;
use warnings;
use Fcntl;
use Fcntl qw ( :mode );
use Test::More qw ( no_plan );

my $filelist = "/home/myuser/filelist.txt";

sysopen ( my $fh, $filelist, O_RDONLY ) or die "Couldn't open $filelist : $!";

while ( my $line = readline $fh ){
    chomp ( $line );
    my @columns       = split ( /,/, $line );
    my $check_name    = $columns[0];
    my $check_is_file = $columns[1];
    my $check_is_dir  = $columns[2];
    my $check_perm    = $columns[3];
    my $check_uid     = $columns[4];
    my $check_gid     = $columns[5];   

    my $mode = ( stat ( $check_name ) )[2];
    my $perm = sprintf "%03o", S_IMODE ( $mode );
    my $uid  = ( stat ( $check_name ) )[4];
    my $gid  = ( stat ( $check_name ) )[5];

    is( S_ISREG ( $mode ), $check_is_file, "$check_name : file check" );
    is( S_ISDIR ( $mode ), $check_is_dir,  "$check_name : directory check" );
    is( $perm,             $check_perm,    "$check_name : permission check" );
    is( $uid,              $check_uid,     "$check_name : uid check" );
    is( $gid,              $check_gid,     "$check_name : gid check" );
}

close ( $fh );

設定ファイル

チェック用の設定ファイル例です。
左から順に、ファイルパス、ファイルチェック、ディレクトリチェック、パーミッション、uid、gidを指定します。


ファイルの場合

/home/myuser/test.txt,1,,644,1003,1003


ディレクトリの場合

/home/myuser,,1,700,1003,1003

チェック結果


以下のチェックを実行します。

  1. ファイルかどうか
  2. ディレクトリかどうか
  3. パーミッションが適切か
  4. uidが適切か
  5. gidが適切か


ちなみに1,2はどちらかにフラグ(値:1)を設定します。


成功した場合はこんな感じです。

# perl check.pl 
ok 1 - /home/myuser/test.txt : file check
ok 2 - /home/myuser/test.txt : directory check
ok 3 - /home/myuser/test.txt : permission check
ok 4 - /home/myuser/test.txt : uid check
ok 5 - /home/myuser/test.txt : gid check
ok 6 - /home/myuser : file check
ok 7 - /home/myuser : directory check
ok 8 - /home/myuser : permission check
ok 9 - /home/myuser : uid check
ok 10 - /home/myuser : gid check
1..10


失敗した場合はこんな感じです。

# perl check.pl 
ok 1 - /home/myuser/test.txt : file check
ok 2 - /home/myuser/test.txt : directory check
ok 3 - /home/myuser/test.txt : permission check
not ok 4 - /home/myuser/test.txt : uid check
#   Failed test '/home/myuser/test.txt : uid check'
#   at check.pl line 37.
#          got: '0'
#     expected: '1003'
not ok 5 - /home/myuser/test.txt : gid check
#   Failed test '/home/myuser/test.txt : gid check'
#   at check.pl line 38.
#          got: '0'
#     expected: '1003'
ok 6 - /home/myuser : file check
ok 7 - /home/myuser : directory check
ok 8 - /home/myuser : permission check
ok 9 - /home/myuser : uid check
ok 10 - /home/myuser : gid check
1..10
# Looks like you failed 2 tests of 10.


本来所有者と所有グループのIDが1003の所、root(ID 0)の為、エラーになっています。


使えそうなら使ってみていただけると嬉しいです。


今日はこんなところで。