使用 C++ 替换 su -c
su -c replacement using c++
我们想运行一个命令,而不是以root用户的身份运行,我们不想使用su -c,但想用c ++编码。
#include <unistd.h>
#include <stdio.h>
int main(void)
{
char *argv[] = { "/bin/sh", "abc.sh", 0 };
char *envp[] =
{
"HOME=/",
"PATH=/bin:/usr/bin",
"TZ=UTC0",
"USER=trishul",
"LOGNAME=tarzan",
0
};
execve(argv[0], &argv[0], envp);
fprintf(stderr, "Oops!n");
return -1;
}
#abc.sh
pwd
date
我使用 chmod 700 abc.sh,不允许用户执行我的示例程序。当使用 root 用户执行上述代码时,我仍然可以看到 pwd 和日期的输出。上述行为正在发生,因为我认为它仍然以 root 身份执行。我需要如何使用execve使示例与"trishul"一起执行。
我的全部意图是拒绝除root之外的普通用户的权限,因为我编写的脚本也将重新启动。用户"trishul"应该被拒绝权限
你能在这方面帮助我们吗?
只是删除执行权限不会这样做:命令/bin/sh abc.sh
不会"执行"abc.sh
,它会执行/bin/sh
,这将读取abc.sh
并执行其中写入的内容(换句话说,/bin/sh
被执行并运行它在abc.sh
中读取的命令,abc.sh
本身不被执行)。因此,使abc.sh
不可执行不会阻止任何人使用它(它只会禁止通过执行例如./abc
直接执行它)。
如果您希望该文件abc.sh
只能由 root 使用(这在评论中建议,但在您的问题中确实不清楚),只需将其所有者更改为 root,然后禁止其他用户读取和执行(也可能写入):
chown root abc.sh # Make root the owner of the file
chmod 700 abc.sh # Give the owner (root) every rights on the file and give none to others
进一步了解您的问题,您希望将用户 ID 更改为trishul
的 execve
之前。使用 setuid() 从 unistd.h
更改您的用户 ID。
如果我理解你的问题,你有一个 *nix 应用程序,如果它没有以 root 身份运行,你想退出它。
如果以 root 身份运行,unistd.h 中的getuid
函数将返回 0:
#include <unistd.h>
#include <iostream>
int main()
{
if (getuid())
{
std::cout << "Not root" << std::endl;
}
else
{
std::cout << "Running as root!" << std::endl;
}
}
所以一个简单的检查是
if (getuid())
std::cout << "You but run this as root" << std::endl;
这适用于linux(在Ubuntu下测试)。 它看起来像标准的POSIX,但我无法确认可移植性。
您可能希望将编译的可执行文件设置为setuid可执行文件(使用chmod u+s
)。要非常小心(所以先阅读高级 Linux 编程,并适当地使用 seteuid(2) 和/或 setreuid(2)...)。
不要犯错误,否则你可以打开一个非常大的安全漏洞!参见 super(1) 命令。
另请阅读有关 bash
中的受限外壳,您可能需要使用它。请注意,外壳需要读取其脚本!
- 模板参数替换失败,并且未完成隐式转换
- 如何用转义符替换字符串中的所有特殊字符
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 在一个读写器队列中,我可以用volatile替换原子吗
- 用符号版本替换对函数的所有调用
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 替换基于地图的所有引用
- 按平均值替换数组中的元素
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 初始化 std::vector 替换为单大括号而不是双大括号
- 删除/替换C++字符串中的多字符 (ÿû)
- 将 malloc 替换为数组
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何在C++中用'\'替换''来处理转义序列?
- 替换密码:哪一个?
- 替换 C++17 中移除的绑定 1st
- 将 Boost MPL 容器替换为 C++17 功能
- C++:如何用单个命令替换复杂的迭代?
- 使用 C++ 替换 su -c