【问题标题】:What API do I call to set a user's password on linux?我应该调用什么 API 在 linux 上设置用户密码?
【发布时间】:2010-10-22 09:49:25
【问题描述】:

我知道passwd(1)crypt(3)。我正在寻找的是要调用的 C API,它将在 passwd/shadow 文件中设置用户的密码,而无需以编程方式遍历文件并覆盖相关用户的条目。应用程序以 root 身份运行。

这样的 API 存在吗?

编辑:我想我应该指定,密码正在不同系统之间同步,所以我们不能简单地调用 system("passwd") 并允许用户在 passwd 提示时输入他们想要的任何密码。我们需要知道密码,以便我们可以使用相同的密码以编程方式更新其他系统。

【问题讨论】:

  • 我会使用正确的参数执行 passwd...
  • 那是什么参数? passwd 没有用于指定密码的参数——只有用户名。 :(

标签: linux passwords passwd


【解决方案1】:

最好的办法是执行带有适当参数的 passwd 命令,让它担心文件处理、加密和文件锁定问题。在某种程度上,无论如何都必须“以编程方式遍历文件”。除非你真的对此有很大的性能问题,否则你最好依赖现有的代码和经验,而不是试图复制现有的代码。

【讨论】:

  • Passwd 命令不允许将密码指定为命令行参数。
  • 仅供参考:如果您的密码中有特殊字符,则通过管道将命令传递给 passwd 会很棘手;逃跑要小心
【解决方案2】:

也许你想要PAM?不确定,但大多数发行版都使用它...

添加: 看起来 Mac OS X 使用 openssl 来管理它的密码散列。在 linux 下可能可以做类似的事情,但根据您的需要,您必须与操作系统使用的身份验证层兼容。

【讨论】:

    【解决方案3】:

    您可以查看 passwd 源代码,但我会先尝试一种更简单、更懒惰的方法:我只需 strace passwd 看看会发生什么。

    【讨论】:

    • strace 不会有太大帮助,它的级别太低了。充其量它会在 /etc/shadow 和 /etc/passwd 上显示打开,并在这些文件句柄上调用 write。
    【解决方案4】:

    使用 /etc/passwd 和 /etc/shadow 存储密码?系统之间的 UID 是否同步?您可以简单地为特定用户复制/覆盖 /etc/shadow 文件中的行。

    而“不要这样做”的答案是使用 NIS 服务器并且只更改一次密码。

    【讨论】:

      【解决方案5】:

      也许 putpwent 调用是您正在寻找的。试试 man putpwent。在快速搜索中,我找到了一个包含一些示例的页面。这可能会有所帮助。

      http://linux.omnipotent.net/article.php?article_id=10935

      检查 getpwnam 查找而不是更改条目并使用 putpwent。

      【讨论】:

        【解决方案6】:

        这很可能会根据相关系统使用的机制而有所不同...

        ...这给我带来了另一个建议,请使用现有工具让不同的系统针对公共存储验证用户 - 例如 LDAP 或您站点上可用的任何目录或主系统。或者设置一个。最好不要NIS+ ^^

        不要像他们所说的那样重新发明轮子。

        从哪里获得明文密码?如果它在那里,为什么还要麻烦密码? (是的,我知道在这些事情上我是个混蛋,抱歉 - 让反对票开始吧;)

        【讨论】:

          【解决方案7】:

          正如 8jean 上面所说,看起来 /usr/sbin/chpasswd 可能是最简单的方法。否则,我会接受 noha 的评论,即使用 fgetpwent() 或 fgetspent() 之类的函数来处理影子文件——遍历用户列表并修改我需要更改的记录。谢谢大家!

          【讨论】:

          • 如果进程正在以root的有效UID执行,chpasswd命令是正确的解决方案。如果不是,那么,这不是正确的解决方案。对于 C 程序,最好的解决方案是使用 shadow-utils 发行版中的 Shadow 库。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-08-12
          • 1970-01-01
          • 2016-03-31
          • 2011-12-20
          • 1970-01-01
          • 2012-04-19
          • 1970-01-01
          相关资源
          最近更新 更多