【问题标题】:Access /Private/etc with c使用 c 访问 /Private/etc
【发布时间】:2011-06-01 04:02:36
【问题描述】:

这可能是一个简单的问题,但我如何在 c 控制台应用程序中向用户“请求”系统/根权限。我需要写信给 /Private/etc 但我不能。这是针对 mac/unix 的。

我已经看到它被用于其他控制台命令,例如当您运行以下命令:“sudo /System/Library/CoreServices/Finder.app/Contents/MacOS/Finder”时,终端会询问您的密码。我该怎么做?

谢谢,JNK

【问题讨论】:

  • 我通过简单地运行命令“sudo /path/to/my/c/file”找到了解决方案...

标签: c shell unix terminal privileges


【解决方案1】:

对于 UNIX 系统,您需要在程序中设置 setuid 标志,并且它应该检查 /etc/passwd 和 /etc/shadow 是否有有效凭据。我相信 crypt(3) 函数用于密码散列。不确定 Mac。

【讨论】:

  • 更不用说这似乎与问题无关,即显示一个 sudo 对话框。
  • 嗯,是的,我忘了提到你可以使用 getpass() (实际上已被弃用)来删除终端中输入字符的回显,同时输入密码。跨度>
【解决方案2】:

没有任何系统调用可以让进程获得 root 权限。您可能期望seteuid 以这种方式工作,但它只能由具有根进程的进程使用(非特权进程只能将 euid 设置为等于 uid)。

sudo 是特殊的,因为它的可执行文件具有 setuid 权限。这意味着当sudo 运行时,它以拥有它的用户(root)而不是执行它的用户身份运行。 sudo 可以通过检查您的密码和读取配置文件来验证您是否具有 root 访问权限。如果检查成功,它会调用forkexecve来执行你请求的命令。

要在非特权应用程序中获得 root 权限,您必须跳过一些环节。您可以使用fork/execve 调用sudo 以获取您自己的命令。一旦通过身份验证,您将拥有一个特权子进程。您可以传递一个特殊的参数或环境变量,以便子进程可以跳转到旨在获得特权的代码。父进程只会等待子进程完成。

【讨论】:

    【解决方案3】:

    在 Mac 上做你想做的事的方法是编写一个“分解的应用程序”,由用户运行的部分和执行特权任务的部分组成。将特权部分安装在系统launchd域中,并让用户工具调用它来完成需要特殊权限的工作。

    您需要确保只能授权使用特权助手,并使用Authorization Services 执行此操作。在用户工具中,您获得了“权利”,然后您将其转换为外部形式并传递给助手。帮助工具应在尝试执行特权工作之前验证它是否正确拥有权限。

    另一种选择是编写整个工具以优雅地失败(在任何一种情况下都必须这样做),并要求用户在需要特权访问时通过sudo 运行它。这就是 UNIX 的其余部分的工作原理。

    【讨论】:

      猜你喜欢
      • 2015-01-04
      • 1970-01-01
      • 2012-09-26
      • 2015-02-19
      • 2011-11-02
      • 2016-03-16
      • 2014-03-16
      • 2015-07-10
      相关资源
      最近更新 更多