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

时间:2010-12-20 05:20:01

标签: c linux permissions

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

我想要自动调用的命令行工具需要以特定用户身份运行,否则无法运行。

我尝试过使用setuid(0),但仍然无法获得理想的结果。

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

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

但是,我希望能够以用户 nobody

的方式登录

我有什么遗失的吗?

3 个答案:

答案 0 :(得分:6)

如果有人可以通过将setuid(0);放在他们的程序中而成为root用户,那么Unix就是Windows。

一些想法:

  1. 从C运行外部命令行工具几乎总是一个错误。
  2. 如果您确实需要此命令行工具,该工具是否真的需要root权限才能工作?如果没有,请修复该工具(或返回步骤1并将功能合并到您自己的程序中)。
  3. 如果您真的需要该工具且它确实需要root,请考虑为其设置sudo权限并通过sudo运行它。
  4. 鉴于您提出的非常基本的问题,您甚至不应该尝试编写将以root身份运行的代码,因此我省略了有关如何为您的程序设置root权限的任何详细信息。

答案 1 :(得分:3)

您不需要在C方面做任何事情。只需更改要使用的用户拥有的二进制文件,启用二进制文件中的setuid位(chmod u+s),就可以了![/ p>

(如果您不希望任何用户能够无条件地以指定用户身份运行,请考虑使用sudo。)

答案 2 :(得分:1)

要更改当前的用户ID:

首先,使用getpwnam()查找新的用户ID。这将返回struct 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()失败时简单地中止。如果更改组成功,但更改用户失败,则会出现真正的问题。