【问题标题】:Execute sudo command in C with system()使用 system() 在 C 中执行 sudo 命令
【发布时间】:2015-04-04 01:12:56
【问题描述】:

我正在编写一段 C 代码,它将在 system("sudo ip route ...") 函数调用中运行一些 sudo 命令。

这个调用是在一个由主线程创建的pthread中完成的,主程序在启动时是用sudo ./program执行的。

当我运行程序时,Ubuntu 提示我输入任何人的密码:

[sudo] password for nobody:

我也尝试直接执行system("ip route ..."),但它给了我负返回意味着它没有被执行。

在线程中应该怎么做才能让system()call使用继承自主程序的sudo权限?

【问题讨论】:

  • Put down that chocolate-covered sudo banana and step away. 你已经隐藏了你的真正问题,即为什么当我的程序以超级用户身份运行时system("something") 不起作用? i> 为了让人们回答这个问题,你必须实际告诉人们你正在尝试运行什么命令,对于初学者来说。
  • @JdeBP 我已经编辑了,是一个ip route命令来操作路由表。
  • @JdeBP 虽然我有点同意这里的观点,但你的文章糟透了它旨在批评的香蕉。使用荒谬的混合隐喻总是非常可爱和有趣,但是 - 与 E. S. Raymond 形成鲜明对比,他的 认真 工作你显然希望将那块 ___ 归类 - 你显然不具备知识或意志力将任何东西添加到伪简洁/“看着我,我很酷”的标题。请停止在互联网上进一步泼你的口水;如果你想认真就认真,如果你想当个混蛋,就私下做。
  • P.S.我相信here is what you meant to say,以后请使用它。
  • 你的/bin/sh是什么外壳?当您以 root 身份在终端中启动 ip route ... 命令时会发生什么?

标签: sudo root c


【解决方案1】:
system("echo XXXX | sudo -S gedit");

您的密码在哪里 XXXX。

【讨论】:

  • 如果你指定-S(这个答案就是这样)。但是,在程序(或特别是脚本)中硬编码您的密码是一个非常糟糕的主意。他甚至应该在这里使用什么密码? sudo 要求他输入“nobody”的密码。还有,gedit和这个问题有什么关系?
  • 详细说明为什么在程序中硬编码密码是个坏主意,原因之一是您刚刚将该密码泄露给了所有可以阅读/proc/$pid/cmdline 的人(即所有人)。
  • 回显密码是不好的做法。因为任何用户都可以通过使用命令看到它:ps -Af | grep echo
【解决方案2】:

您无需执行任何特殊操作即可继承sudo 赋予您的root 权限。进程通常会自动继承其父进程的权限。 system(3) 不起作用的原因可能是因为您是 root(见下文)或因为您在线程上。

话虽如此,请不要使用system(3)。这是因为sudo 使用setuid 工作,而system() 不能很好地发挥作用。因此,请改用exec(3) 系列函数(execlp()execvp() 除外)。请参阅man 3 system 了解更多信息。

现在,那个被说,不要使用system(3) exec(3)。相反,只需直接调用 C API 来操作 IP 表。当您可以简化程序时,为什么还要浪费系统资源来生成一两个新进程? (不过,此时您的问题属于 Stack Overflow)。

【讨论】:

  • 嗯。 system() 不适用于 setuid 程序,其中进程的有效 UID 是可执行文件的所有者,而真正的 UID 是运行它的人的原始 UID(即它们是不同的)。但是在sudo(或su)下,有效UID和真实UID是一样的,不知道为什么会有问题。
  • @Scott,啊,没关系。 sudo 是一个 setuid 二进制文件,但我猜它会在执行其他任何操作之前更改真实 id 和有效 id。
  • 手册页似乎没有解释为什么不是execlp 也不是execvp。使用exec 的PATH 搜索变体来执行此操作有什么危险? (在我的情况下,我想运行一个不同的 setuid 程序)。
猜你喜欢
  • 2013-03-12
  • 2011-10-04
  • 2021-02-27
  • 1970-01-01
  • 2013-09-04
  • 2012-01-24
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多