【发布时间】:2016-08-02 15:41:52
【问题描述】:
我正在尝试将一些文件从非常低(几乎没有特权)的用户复制到 root 用户。我需要允许有权访问低帐户的人将一些文件复制到更高帐户。我曾考虑过使用 bin/Bash 脚本,但我不想查看文件中的任何密码。
我决定创建一个 C++ 应用程序,其中包含我想传递给 su/setuid 命令的帐户密码。我知道密码可以在二进制文件中查看,但不是问题。密码不是纯文本就足够了。
我的问题是我无法弄清楚如何以用户身份“登录”,我需要更新在该帐户中运行的服务的文件。我有用户帐户名 localadmin 和该帐户的密码。但是如何将这些传递给 Linux 以将文件从 C++ 应用程序复制到 localadmin 帐户主/子目录?
我在 C++ 中尝试过:
system("su localadmin"); // 这里提示输入密码,但不知道如何传递密码。
setuid(0); // 同样,我在哪里传递密码以获得帐户权限?我得到的只是“不允许的操作”。
如果这是一个简单的问题,我深表歉意。我只是想以 localadmin 身份运行命令并完成。
【问题讨论】:
-
在你的程序中记录 root 密码是一个糟糕的主意,有几个原因,至少包括 (1) 可以从二进制文件中提取密码,以及 (2) 如果 root 用户程序会中断密码已更改。这就是为什么必须为非特权用户提供提升权限的程序通常设置为 setuid-root 的原因,这是他们的所有权和模式的函数,而不是他们的实现。
-
听起来像XY problem。带有 ACL(访问控制列表)的公共目录如何为非特权用户提供仅插入权限?
-
@JohnBollinger,感谢您的回复,非常感谢。我确实了解将密码嵌入二进制文件的后果,但这不是问题。我给这个的人没有那种知识。我只需要这个二进制文件以 root 用户身份执行所有命令。我希望通过给他们一个二进制文件来实现这一点。
-
@JayMa:你错过了分数!如果密码改变了怎么办?恶意软件可以轻松扫描二进制文件以获取密码。无论您需要,您的方法都是错误的!没有任何借口!
-
@Olaf,感谢您提供的信息。我明白这一切。这是我需要执行的一次性更新。我可以控制 root 密码,所以没有人会更改它,尤其是在远程系统上。我确实需要它按照所说的执行。我不知道有任何其他方法可以从无权访问 root 帐户的帐户复制文件,而所有操作都必须从低级别帐户完成。