前回の記事の派生で、今度はユーザー名とグループ名を取得してみます。
my ($user, $group) = (stat $file)[4,5]; # $user は user id # $group は group id # ID番号から名前を取得 print 'user: ', [getpwuid($user)]->[0], "¥n"; print 'group: ', [getgrgid($group)]->[0];
getpwuid はユーザIDに対する情報を返します。
参考:getpwuid - Perlリファレンス
getgrgid はグループ名に対する情報を返します。
参考:getgrgid - Perlリファレンス
[ getpwuid( $user ) ]->[0]
は
( getpwuid( $user ) )[0]
とやっても一向に構いませんし、一旦、配列で受けてから値を取り出してもいいです。
また、スカラーコンテキストだとユーザー名を返すので、
強制的にスカラーコンテキストにするスカラー擬似関数を用いて、
my ($user, $group) = (stat $file)[4,5]; # $user は user id # $group は group id # ID番号から名前を取得 print 'user: ', scalar getpwuid($user) , "¥n"; print 'group: ', scalar getgrgid($group);
としてもいいです。
(この記事を書きながらscalarがスカラー擬似関数という名前だってはじめて知った)
さらに、今プログラムを実行しているのが誰なのかも知ることができます。
Perlの特殊変数に $> と $) がありこれはそれぞれ、プロセスの実効UIDと実効GIDです。
$) はgidを複数返す場合があるので、その場合は単一のものを抜き出す
処理が必要です。
print 'user: ', scalar getpwuid($>); #実行しているプロセスの実効ユーザー名 print 'group: ', scalar getgrgid($)); #実行しているプロセスの実効グループ名
参考:特殊変数 - Perlでいいよ
(実UIDと実効UIDって何が違うんだろう・・・)
こうやってユーザー名やグループ名を取得すれば、
いま実行しているユーザーがそのファイルを操作する権限をもっているかどうかが
チェックできますね。
(あ、でもユーザーやグループが一致するかどうかはIDの数字の比較だけでいいのか)