【问题标题】:Creating a Unix user from an application从应用程序创建 Unix 用户
【发布时间】:2013-03-06 18:25:58
【问题描述】:

我正在开发一个与更大的维护应用程序相关联的本土用户数据库。

这个想法已经浮出水面,将我们的用户与系统用户联系起来,每次在我们的程序中生成新用户时创建匹配的 /etc/passwd 条目。其他交互,例如查询用户名的 uid/gid,反之亦然,验证文件系统所有权等。我们已经定义了标准字段,如 user.uid、user.gid、user.home、内部权限等,只需要一个将这些传递到系统的方法。

问题是,在网上搜索任何信息都是大海捞针——我找不到任何用于用户帐户 getter 和 setter 的标准库,我开始怀疑它们是否存在?这里是 spawnv useradd 的正确方法吗?看来一定有更好的办法!

请注意,运行此系统的系统是一次性使用(虚拟化),用于所有意图和目的。

最终编辑:事实证明,最经济的解决方案是:

useradd -g group -c "firstname lastname" -d /export/home/username -m -s /bin/bash username

【问题讨论】:

  • 我怀疑在 db-users 和 system-users 之间建立 1:1 关系是个好主意。这将 db-app 紧密绑定到底层操作系统结构,这可能不是您真正想要的,至少从长远来看不是。您最好设置第三个(独立)实体进行身份验证,然后可以用来验证 db-user 和/或 OS-users。 LDAP 可能是这样做的首选工具。
  • @OliCharlesworth Linux != Solaris
  • @Kay:公平点!我读得太快了。
  • 这个更适合alt.se.prog
  • @ColeJohnson 如果它超出了 SO 的范围,那么 unix.stackexchange.com 将是该问题的合适位置。

标签: c unix solaris user-accounts libc


【解决方案1】:

useradd 是您要找的吗?

useradd -g group -c "firstname lastname" -d /export/home/username -s /bin/ksh username
mkdir -p /export/home/username
chown username /export/home/username

【讨论】:

  • 不要在生产代码中使用您自己的实现。你搞砸你的系统,这是肯定的。
  • @Derek_6424246:调用其他程序是 Unix 的做事方式。强烈鼓励这样做,你应该这样做。实际上,在代码中执行此操作是更糟糕的解决方案。
  • @ColeJohnson:从技术上讲,系统级工具库,只是使用方式不同。但是使用单独的程序执行此操作还有另一个原因:SUID,这在某些系统配置中可能是必需的。您不希望最终用户程序成为 SUID。
  • @ColeJohnson:SUID 二进制文件,即以拥有程序可执行文件的用户:组的权限执行的程序。许多与用户帐户管理相关的工具都是或曾经是 SUID。 /usr/sbin/passwd 是其中之一:它是 SUID root,如果不是,则无法使用新密码更新系统密码数据库。
  • @ColeJohnson:执行 SUID 的代码对安全性至关重要,因此必须仔细编写并首先考虑安全性。如果有一个用于用户管理的库,那么链接该二进制文件的程序也必须是 SUID,这意味着消费者程序的安全要求非常高。因此,在任何维护良好的 Unix(类)系统中都找不到这种库,因为这样的库在二级上会非常危险。
【解决方案2】:

你可以把你的程序变成NIS。无法帮助您实际执行此操作,但可能值得您考虑。

补充:您或许也可以使用 ldap。

但这两者中的任何一个都意味着您只需要使数据库保持最新状态。密码会自行处理

【讨论】:

  • 鉴于我最初的问题,这可能是更好的答案。但是,考虑到将其作为解决方案实施的成本(以及问题的相对低优先级),我不得不使用外部操作系统调用。
  • 可以理解。我不会反对你。你只是一个优秀的程序员,天生懒惰。 :D
猜你喜欢
  • 2019-07-24
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
相关资源
最近更新 更多