비밀번호를 변경해야 하는 Samba 사용자를 어떻게 나열하고 필터링합니까?

비밀번호를 변경해야 하는 Samba 사용자를 어떻게 나열하고 필터링합니까?

분명히 다음 명령을 사용하여 Samba 사용자가 비밀번호를 변경해야 하는지 확인할 수 있습니다.

pdbedit -v -u userid | grep "Password must change"

또한 다음을 사용하여 모든 Samba 사용자를 나열할 수 있다는 것을 알았습니다.

pdbedit -L -v

다음 형식으로 약 10MB의 데이터를 출력합니다.

---------------
Unix username:        egbjt005$
NT username:          egbjt005$
...
Password must change: Thu, 16 Aug 2012 07:33:58 NZST
...
---------------
Unix username:        eghwj001$
NT username:          eghwj001$
...
Password must change: Fri, 20 Jul 2012 14:42:46 NZST
...

... 흥미롭지 않은 데이터의 몇 행을 나타냅니다. 비밀번호가 만료되었고 변경되지 않은 경우 이 날짜는 과거가 됩니다.

내가 정말로 원하는 것은 비밀번호 변경이 필요한 특정 2자 접두사(예를 들어 "eg"를 사용)로 시작하는 사용자 ID 목록입니다. 어떻게 해야 하나요?

답변1

pdbedit온라인에서 찾은 몇 가지 출력 예제를 살펴보겠습니다 . 귀하의 코드는 다를 수 있습니다. 인쇄된 내용의 몇 가지 예를 제공할 수 있다면 이 코드가 귀하의 요구에 더 적합할 수 있습니다.

먼저, 접두사와 일치하는 사용자 이름을 찾아야 합니다. 다음을 사용할 수 있도록 출력 형식이 pdbedit지정된 것 같습니다 .username: fooawk

pdbedit -L -v | awk '/username:/ {print $2}'

그런 다음 접두사로 시작하는 이름을 찾아야 하므로 grep을 사용해 보겠습니다.

pdbedit -L -v | awk '/username:/ {print $2}' | grep ^eg

특정 사용자의 비밀번호를 변경해야 하는지 확인하려면 grep반환 코드를 확인하여 문자열이 있는지 확인할 수 있습니다.

if pdbedit -v -u $name | grep -q "Password must change" ; then
    echo $name
fi

각 이름을 확인하는 루프로 모든 것을 하나로 묶습니다.

for name in $(pdbedit -L -v | awk '/username:/ {print $2}' | grep ^eg); do
    if pdbedit -v -u $name | grep -q "Password must change" ; then
        echo $name
    fi
done

예제 출력 게시 후 업데이트

이 형식은 일반 Unix 명령줄 텍스트 처리 도구를 좋아하는 사람들이 설계한 것이 아닙니다! 물론 어떤 언어로든 무엇이든 할 수 있지만 저는 아마도 이 언어를 구문 분석하기 위해 Python이나 Perl과 같은 언어를 사용할 것입니다. Python이 날짜와 시간을 제대로 처리하지 못하기 때문에 여기서는 Perl을 선택했습니다.

#!/usr/bin/perl

use Date::Parse;

$now = time();
while (<>) {
    if (/Unix username:\s*(.*)/) {
        $username = $1;
    }
    if (/Password must change:\s*(.*)/) {
        $change = str2time($1);
        if ($change <= $now) {
            print "$username\n";
        }
    }
}

이는 비밀번호가 만료된 모든 사용자의 Unix 사용자 이름을 인쇄합니다. 다음과 같이 사용하세요:

pdbedit -L -v | perl parse.pl

질문 작성자가 편집함

내가 사용한 코드는 다음과 같습니다.

#!/usr/bin/perl
use Date::Parse;
$now = time();
while (<>) {
    if (/Unix username:\s*(.*)/) {
        $username = $1;
    }
    if (/Password must change:\s*(.*)/) {
        $expiry = $1;
        $change = str2time($expiry);
        if ($expiry !~ /^never/ && $change <= $now && $username =~ /^eg[a-z]{3}\d+/) {
            print "$username expiry: $expiry\n";
        }
    }
}

다음 출력을 생성합니다.

egdfd001 expiry: Mon, 30 Jul 2012 08:12:02 NZST
egjpf001 expiry: Mon, 13 Aug 2012 07:50:03 NZST

관련 정보