/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(필요한 경우).

관련 정보