如何在C代码中更改linux用户?

Ola*_*eni 4 c linux permissions

如何更改我的c程序将自己标识为的用户?

我想要自动调用的命令行工具需要作为特定用户运行,否则将无法运行.

我尝试过使用setuid(0)但我仍然没有得到预期的结果.

我想模仿的用户不是' root ',而是普通的无特权,无shell用户.我希望能够以用户nobody身份运行登录的二进制文件.我能够使用以下方法将解决方案编写为"root":

su -ls /bin/bash -c /binary (超级用户)

但是我希望能够实现与用户nobody相同的登录

有什么我想念的吗?

R..*_*R.. 8

如果任何人都可以通过setuid(0);加入他们的程序而成为root用户,那么Unix就是Windows.

一些想法:

  1. 从C运行外部命令行工具几乎总是一个错误.
  2. 如果您确实需要此命令行工具,该工具是否真的需要root权限才能工作?如果没有,请修复该工具(或返回步骤1并将功能合并到您自己的程序中).
  3. 如果你真的需要这个工具并且它确实需要root,请考虑sudo为它设置权限并通过sudo运行它.

鉴于您提出的非常基本的问题,您甚至不应该尝试编写将以root身份运行的代码,因此我省略了有关如何为程序设置root权限的任何详细信息.


小智 6

要更改当前用户 ID:

首先,使用 查找新的用户 ID getpwnam()。这将返回 astruct passwd *pw并且 NULL 值将指示用户不退出。包含执行更改所需的struct用户 ID ( pw_uid) 和组 ID ( )。pw_gid

if((pw = getpwnam(userid)) == NULL) sprintf(error_msg "Userid '%s' does not exist", userid);

然后为新用户设置组id

if (setgid(pw->pw_gid) != 0) sprintf(error_msg "setgid() to %d failed", pw->pw_gid);

最后,设置新用户的用户id

if (setuid(pw->pw_uid) != 0) sprintf(error_msg "setuid() to %d failed", pw->pw_uid);

这个过程中的错误恢复是混乱的。setgid()最简单的方法是在或失败时直接中止setuid()。如果更改组成功,但更改用户失败,则会出现真正的问题。