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