如何配置一个 shell 脚本来解析每个 dn 的 ldif 格式的 ldap 数据:

发布于 2024-12-23 02:53:28 字数 954 浏览 3 评论 0原文

我有一个类似这样的 LDIF 数据库。

dn: uid=user1,ou=People,dc=example,dc=com
mail: [email protected]
passwordexpirationtime: 20120113203000Z

dn: uid=user2,ou=People,dc=example,dc=com
mail: [email protected]
passwordexpirationtime: 20120113203000Z

dn: uid=user3,ou=People,dc=example,dc=com
mail: [email protected]
passwordexpirationtime: 20120113203000Z

如何配置 shell 脚本来解析每个 dn:检查passwordexpirationtime 的值,将其与当前日期进行比较。如果少于 10 天,则将邮件发送到邮件属性中的值?

如果我通过 grep passwordexpirationtime |awk -F ':' '{print $2}' 搜索属性的值,它将返回所有 dn: 的值:我如何知道哪个 mail: 与哪个 dn 关联:

I have a LDIF database something like this.

dn: uid=user1,ou=People,dc=example,dc=com
mail: [email protected]
passwordexpirationtime: 20120113203000Z

dn: uid=user2,ou=People,dc=example,dc=com
mail: [email protected]
passwordexpirationtime: 20120113203000Z

dn: uid=user3,ou=People,dc=example,dc=com
mail: [email protected]
passwordexpirationtime: 20120113203000Z

How can I configure a shell script to parse each dn: check the value of passwordexpirationtime, compare it with current date. if less then 10 days then send a mail to value in mail attribute ?

If I search the value of attribute by grep passwordexpirationtime |awk -F ':' '{print $2}' It will return value for all dn: how will I know which mail: is associated by which dn:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

狂之美人 2024-12-30 02:53:28

你可以告诉 awk 用不同的分隔符分割输入:

BEGIN { RS="\n\n"; FS="\n" }

这样它会将记录分割为块,将字段分割为行,然后你可以获得每个记录的第三个字段,去掉日期并进行比较。

但是如果你有一个 python 脚本来检查日期,为什么不在 python 中完成这一切呢?

you can tell awk to split the input by different separators:

BEGIN { RS="\n\n"; FS="\n" }

that way it'll split the records as blocks and the fields as lines, then you can get the third field of each record, strip the date and compare it.

but if you have a python script to check the date, why don't you just do it all in python?

×纯※雪 2024-12-30 02:53:28

您可以像这样转换文本:

mail: [email protected] passwordexpirationtime: 20120113203000Z

邮件:[电子邮件受保护] 密码过期时间:20120113203000Z

邮件:[电子邮件受保护] 密码过期时间:20120113203000Z

使用此脚本:

cat ldif.txt | tr '\n' '|' | sed 's/||/\n/g' | awk -F"|" '{打印$2,$3}'

You could transform the text like this:

mail: [email protected] passwordexpirationtime: 20120113203000Z

mail: [email protected] passwordexpirationtime: 20120113203000Z

mail: [email protected] passwordexpirationtime: 20120113203000Z

use this scripts:

cat ldif.txt | tr '\n' '|' | sed 's/||/\n/g' | awk -F"|" '{print $2,$3}'

尤怨 2024-12-30 02:53:28

这可能对您有用:

awk '{print $4,$6}' RS='' ldif.txt
[email protected] 20120113203000Z
[email protected] 20120113203000Z
[email protected] 20120113203000Z

现在您所要做的就是添加一些日期算术,如下所示:

awk '{if(systime()+(10*24*60*60)-mktime(gensub(/(....)(..)(..)(..)(..)(..)(.)/,"\\1 \\2 \\3 \\4 \\5 \\6 \\7",1g,$6))>0)print $4}' RS='' ldif.txt

This might work for you:

awk '{print $4,$6}' RS='' ldif.txt
[email protected] 20120113203000Z
[email protected] 20120113203000Z
[email protected] 20120113203000Z

Now all you have to do is add some date arithmetic, like so:

awk '{if(systime()+(10*24*60*60)-mktime(gensub(/(....)(..)(..)(..)(..)(..)(.)/,"\\1 \\2 \\3 \\4 \\5 \\6 \\7",1g,$6))>0)print $4}' RS='' ldif.txt
南城旧梦 2024-12-30 02:53:28

这是 python 中的解决方案,因为这似乎是您正在使用的语言:

with open('ldif.txt') as f:
    for line in f:
        if line.startswith('passwordexpirationtime'):
            _, date = line.split(': ')
            print date

here's a solution in python, since that seems to be the language you're using:

with open('ldif.txt') as f:
    for line in f:
        if line.startswith('passwordexpirationtime'):
            _, date = line.split(': ')
            print date
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文