/homeディレクトリを持たないユーザーと、ユーザーがいない/homeディレクトリを印刷します。

/homeディレクトリを持たないユーザーと、ユーザーがいない/homeディレクトリを印刷します。

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(必要な場合)。

関連情報