パスワードを変更する必要がある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

各名前を解決するループで、すべてを1つにまとめます。

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

関連情報