我知道passwd(1)
和crypt(3)
。我正在寻找的是要调用的 C API,它将在 passwd/shadow 文件中设置用户的密码,而无需以编程方式遍历文件并覆盖相关用户的条目。应用程序以 root 身份运行。
这样的 API 存在吗?
编辑:我想我应该指定,密码正在不同系统之间同步,所以我们不能简单地调用 system("passwd") 并允许用户在 passwd 提示时输入他们想要的任何密码。我们需要知道密码,以便我们可以使用相同的密码以编程方式更新其他系统。
这很可能会根据相关系统使用的机制而有所不同......
...这给我带来了另一个建议,使用现有工具让不同的系统针对公共存储对用户进行身份验证 - 例如 LDAP 或您站点上可用的任何目录或主系统。或者设置一个。最好不要NIS+ ^^
不要像他们所说的那样重新发明轮子。
您将从哪里获得明文密码?如果它在那里,为什么还要麻烦密码?(是的,我知道在这些事情上我是个混蛋,对不起 - 让反对票开始吧;)
正如 8jean 上面评论的那样,看起来 /usr/sbin/chpasswd 可能是最简单的方法。否则,我会接受 noha 的评论,即使用 fgetpwent() 或 fgetspent() 之类的函数来处理影子文件——遍历用户列表并修改我需要更改的记录。谢谢大家!
使用 /etc/passwd 和 /etc/shadow 存储密码?系统之间的 UID 是否同步?您可以简单地为特定用户复制/覆盖 /etc/shadow 文件中的行。
而“不要这样做”的答案是使用 NIS 服务器并且只更改一次密码。
也许 putpwent 调用是您正在寻找的。试试 man putpwent。在快速搜索中,我找到了一个包含一些示例的页面。它可能会有所帮助。
http://linux.omnipotent.net/article.php?article_id=10935
检查 getpwnam 查找而不是更改条目并使用 putpwent。
也许你想要PAM?不确定,但大多数发行版都使用它...
补充:它看起来像 Mac OS Xopenssl
用来管理它的密码散列。在 linux 下可能会做类似的事情,但根据您的需要,您必须与操作系统使用的身份验证层兼容。
您可以查看 passwd 源代码,但我会先尝试一种更简单、更懒惰的方法:我只需 strace passwd 看看会发生什么。
最好的办法是使用适当的参数执行 passwd 命令,让它担心文件处理、加密和文件锁定问题。在某种程度上,无论如何都必须“以编程方式遍历文件”。除非你真的对此有很大的性能问题,否则你最好依赖现有的代码和经验,而不是试图复制现有的代码。