home
ディレクトリを持たないユーザーと、home
ユーザーに接続されていないディレクトリを含むフォーマットされたリストを生成するPerlスクリプトを開発する必要があります。たとえば、次のスクリプトを使用してシステムユーザーを読み取る場合は、ホームディレクトリに基づいてユーザーがいないユーザーをどのように印刷しますかUID
?
open (USERS, '-|' , 'getent passwd' ) or die $!;
@passwd_entries = <USERS>;
close USERS;
以下のスクリプトを使用してシステムのホームディレクトリを読み取る場合、ユーザーは接続されていないディレクトリをどのように印刷しますか?
open (HOMES, '-|' , 'ls /home' ) or die $!;
@home_dirs = <HOMES>;
close HOMES;
答え1
解決策が満足のいくものであれば、bash
ホームディレクトリを持たないユーザのリストと、パスワードデータベースにユーザがいないそのディレクトリの下にある/home
ディレクトリのリストが作成されます。/home
comm -3 <(getent passwd | cut -d: -f6 | sort -u) <(ls -d1 /home/*)
答え2
Perlを使ってからかなり時間が経ちましたが、あなたが行くべき場所に行くのに役立つと思いました。 Perlを使用しているので、どのbash
コマンドも使用しません。
#!/usr/bin/perl
use strict;
use warnings;
# this will get all users and homedirs directly
while(my ($name,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwent()){
my $dirstate;
# this will check if $dir exists and is a directly
if (-e $dir and -d $dir) {
$dirstate = 'homeexists';
} else {
$dirstate = 'nohome';
}
# here you have knowledge of which home dirs do and do not exist in $dirstate
print "$name:$uid:$gid:$gcos:$dir:$shell:$dirstate\n";
}
あるいは、実際にbashコマンドを使用したい場合、このライナーはほぼ同じことを行います。
getent passwd | awk -F: '{printf "%s %s\n",$1,$6}' | while read i; do home=($i); if [ ! -d ${home[1]} ]; then home+=("nohome") ; fi ; echo ${home[@]}; done
ユーザーがいないホームディレクトリについては、ホームディレクトリがファイルシステムのどこにでもある可能性があるため、これを実装する最良の方法が何であるかわかりません。これを使用してls
コンテンツを確認し/home
、それを介して取得したユーザーと比較することができますgetent
(必要な場合)。