显然,我可以使用以下命令来确定 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
我在网上找到的输出示例。你的可能会有所不同;如果您可以提供一些打印内容的示例,则此代码可以更适合您的需求。
首先,您需要找到与您的前缀匹配的用户名。输出似乎pdbedit
是username: 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