c++ - 在使用密码执行 C++ 二进制文件时切换到 Linux root 帐户,可能吗?

标签 c++ linux shell setuid

我正在尝试将一些文件从权限非常低(几乎没有权限)的用户复制到根用户。我需要允许有权访问低帐户的人将一些文件复制到较高帐户。我考虑过使用 bin/Bash 脚本,但我不希望查看文件中的任何密码。

我决定创建一个 C++ 应用程序,其中包含我想要传递给 su/setuid 命令的帐户密码。我确实知道可以在二进制文件中查看密码,但这不是问题。非纯文本密码就足够了。

我的问题是,我无法弄清楚如何作为用户“登录”,我需要更新该帐户中运行的服务的文件。我有用户帐户名 localadmin 以及该帐户的密码。但是如何将这些传递到 Linux 以将文件从 C++ 应用程序复制到 localadmin 帐户主目录/子目录?

我在 C++ 中尝试过:

system("su localadmin");//这会提示输入密码,但不确定如何传递密码。

setuid(0);//同样,我在哪里传递密码来获取帐户权限?我得到的只是“不允许操作”。

如果这是一个简单的问题,我深表歉意。我只是想以 localadmin 身份运行命令并完成。

最佳答案

您不需要提供密码。让您的应用程序 setuid root,以便它以 root 权限运行。

使用 root 权限,执行以下操作:

chown root {program}
chmod 4755 {program}

现在您的可执行文件由 root 拥有并设置了 setuid 位。因此,当任何用户运行它时,它都会以 root 身份运行。然后程序就可以做它需要做的事情了。

创建 setuid root 程序时,需要特别小心,以确保所有输入都得到正确清理,以防止缓冲区溢出或格式字符串漏洞。此外,如果您的程序不仅仅是调用另一个程序,那么它应该在开始使用 seteuid({callers_uid}) 时放弃权限,在需要时使用 seteuid(0) 提升权限,并在完成后再次将其降回。

如果您只希望特定用户运行此程序,您可以使用 sudo 而不是让程序设置为 root。 root 用户需要更新/etc/sudoers 文件并为相关用户和程序添加一个条目,并包含一个不需要密码的选项。

例如:

user_name ALL = (root) NOPASSWD:program_to_run

然后用户可以运行:

sudo program_to_run

然后这个用户(并且只有这个用户)可以使用 root 权限运行该程序来执行它需要执行的任何操作。

关于c++ - 在使用密码执行 C++ 二进制文件时切换到 Linux root 帐户,可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38724981/

相关文章:

c++ - 在 C 中的 16 字符数组中连接 32 位 int block

c++ - 为什么我的 dev-c++ "can' t 打开输出文件”?

linux - 如何将STDIN发送到docker进程

c++ - `std::function` 是否允许移动其参数?

java - java中是否存在关于友元函数的任何内容?

linux - Makefile patsubst 使用 shell 变量的值

c - fgets 错误消息循环 - C 中的 Linux shell

linux - 我可以在别名中使用 source 命令吗?

c++ - 使用 C++ 进行 Linux 编程

linux -/sites/default/files/中的我的 tmp 文件夹在 DRUPAL 7 中不会自动清除