如何列出和过滤需要更改密码的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 个字符前缀开头的用户 ID 列表(让我们使用“eg”作为示例),需要更改密码。我怎样才能做到这一点?

答案1

我将介绍一些pdbedit我在网上找到的输出示例。你的可能会有所不同;如果您可以提供一些打印内容的示例,则此代码可以更适合您的需求。

首先,您需要找到与您的前缀匹配的用户名。输出似乎pdbeditusername: foo格式化的,因此您可以使用awk以下方法:

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 等语言来解析此语言。我在这里选择 Perl 是因为 Python 对日期和时间的处理很糟糕。

#!/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

相关内容