我正在编写一个简单的包管理器,如果程序没有以root身份运行,我想自动尝试sudo。我找到了一个名为seteuid的函数,它看起来就像我需要的那样,但我没有运行它的权限。到目前为止,我所能想到的是一个bash脚本,在它们到达实际的二进制文件之前要检查,但如果可能的话,我想把它们全部用作C ++。
是否有任何方法在开始执行后更改进程的euid?还是一种叫sudo的方式?
答案 0 :(得分:4)
以下是这些功能的工作原理。
如果一个程序有setuid位,它将作为它的所有者执行。一旦执行,它可以调用seteuid作为原始用户而不是其所有者运行。 ditty for setgid。
原则是最小特权的原则。如果我编写一个需要特殊访问权限的程序,我希望尽可能少的代码来运行访问。所以,我安装它setuid,但它做的第一件事就是在需要它们的狭窄代码窗口之前返回特权。
你不能调用sudo(当然,除了fork / exec)。您可以 像sudo一样安装setuid的程序,并决定何时适当地使用该强大的功能。
答案 1 :(得分:3)
正如bmargulies在his answer中所说,如果二进制由root拥有并且设置了setuid位,那么可以执行此操作 - 但是您需要实现身份验证部分(检查实际上也允许用户自己成为root用户。
您实际上是在应用程序中重写sudo
- 处理此问题的最佳方法是执行您自己建议的操作,并使用包装脚本安装应用程序,该脚本使用/usr/bin/id
来检查是否它是root,如果没有,请致电sudo
(或su
)。