【问题标题】:How do I change linux user within C code?如何在 C 代码中更改 linux 用户?
【发布时间】:2011-05-28 02:11:19
【问题描述】:

如何更改我的 c 程序标识的用户?

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

我尝试过使用setuid(0),但仍然没有得到想要的结果。

我要模仿的用户不是“root”,而是普通的无权限、无壳用户。我希望能够运行以用户nobody 身份登录的二进制文件。我能够使用以下方法将解决方案设置为“root”:

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

但是我希望能够实现与用户 nobody

相同的登录

我有什么遗漏吗?

【问题讨论】:

  • 我确信不应该有办法做到这一点。如果有,那就是操作系统中需要修复的一个主要漏洞。如果用户没有权限,你应该做的是让你的程序抱怨并退出(也许建议他们使用 sudo)
  • 您真正想做的是什么?除了破坏整个系统之外,可能还有其他方法。
  • 虽然重要性有限,但我只想指出,每个人都假设“特定用户”是 root。如果不是这样,我不会感到惊讶。
  • 你是对的,“特定用户”不是root,而是没有分配shell的通用用户;但是我要运行的工具会检查运行它的用户是否是该特定用户。

标签: c linux permissions


【解决方案1】:

如果有人可以通过在他们的程序中输入setuid(0); 来成为root,那么Unix 就是Windows。

一些想法:

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

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

【讨论】:

  • 我不清楚为什么您认为 Windows 中的 C 程序可以通过调用 setuid(0) 的等效项来获得管理员权限。很久没有使用 Windows 95/98/Me 了。
  • 我指的是 Windows Vista/7 弹出“此操作需要管理员权限。您想成为管理员吗?”的行为。窗户。它至少应该有一个高级逻辑谜题,这样不能/不会阅读/理解消息的用户不会只是点击“是”按钮。
  • 当启动系统配置 GUI 应用程序时,一个 ubuntu 框会弹出一个类似的对话框。
  • 如果世界上还有任何理智,它会要求输入密码,对吗?请告诉我它要求输入密码...
  • Chris,那是因为它使用了比传统的 UNIX 特权机制更复杂的 PolKit 框架。
【解决方案2】:

您不需要在 C 端做任何事情。只需将二进制文件更改为您要使用的用户拥有,启用二进制文件中的 setuid 位 (chmod u+s),一切就绪!

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

【讨论】:

  • 我真的希望没人会写这个。显然,只要他这样做,OP就知道足以让自己扎根......
  • @R.. 哎呀!评论已删除。我的错。
【解决方案3】:

更改当前用户名:

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

【讨论】:

  • 谢谢你不认为我们都是白痴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多