如何在Linux中临时获取超级用户权限,你还是只知其一不知其二吗

7 篇文章 0 订阅
2 篇文章 1 订阅

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quhdnzRb-1609466645565)(https://imgkr2.cn-bj.ufileos.com/80492072-2046-4795-be4a-e09246dd3554.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=2l6jY7abwY1WNM7h8c7N1%252Bh5cFk%253D&Expires=1609552152)]

大家好!我是Sean!

好久没有出现了,今天讲下如何让我们的程序临时获取到root权限。

前言

首先熟悉两个个概念:权限位、用户。

权限位

Linux 将访问文件的用户分为 3 类,分别是文件的所有者(u),所属组(g)(也就是文件所属的群组)以及其他人(o)。并为 3 种不同的用户身份,分别规定了是否对文件有读(r)、写(w)和执行(x)权限。

用户

Linux系统中的用户分为超级用户(uid=0)和普通用户(uid=[500, 60000])以及系统用户(uid=[1, 499]),其中:
超级用户拥有操作一切的能力。
系统用户是Linux系统正常工作所必需的内建的用户,一般是用于管理服务所用。系统用户不能用来登陆,如bin、daemon、lp等用户。
普通用户是为了让使用者能够使用Linux系统资源而建立的,用户新建的账号一般就是普通账号。

因此

出于安全考虑,程序在Linux系统中要求以普通用户身份运行,当然有些公司直接拿root跑程序,也不是不可以,只是root权限过于大,啥事情都能干,比如哪天手误脚本了写了个:

rm -rf *

说不定就把某些重要数据给删除了,甚至直接把自己的系统都给搞宕机,出现这种情况,不管是对公司还是对个人的损失都是巨大的。

临时获取超级用户权限的两种方式

方式一:sudo

这中方式是针对shell命令或shell脚本,程序中通过sudo调用脚本达到临时获取root权限的效果,我们可以这么用:

sudo hello_world.sh

在没有做sudoers配置的情况下,使用sudo执行是需要输入root密码的,如果不想输入密码,可以在/etc/sudoers中配置脚本的全路径名称即可,调用时要用全路径:

sudo /opt/Sean/hello_world.sh

(关于sudoers的配置后续再出一篇文章详细讲解。)

方式二:setuid

说setuid前,有一个特殊的权限位不得不提一下,强制位(s权限),这个是我们实现临时获取root权限的关键。

s权限

s权限:设置使文件在执行阶段具有文件所有者的权限,相当于临时拥有文件所有者的身份. 典型的文件是passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权限, 从而可以更改用户的密码。
可以通过以下命令进行s权限设置:

chmod 4755 hello_world
或
chmod u+s hello_world
话不多说,show the code
#include <iostream>
#include <string>
#include <unistd.h>

using namespace std;

int main()
{
	uid_t uid = getuid();
	cout << "try to change: uid{" << getuid() << "} euid{" << geteuid() << "}" << endl;
	// 任何用户执行时,都以setuid程序文件所属的用户的身份运行
	if(setuid(0))
	{
		cout << "change failed: uid{" << getuid() << "} euid{" << geteuid() <<"}" << endl;
		return -1;
	}
	cout << "change success: uid{" << getuid() << "} euid{" << geteuid() <<"}" << endl;
	
	// do what you want to do by root

	setuid(uid);
	if(getuid() == uid)
	{
		cout << "change back: uid{" << getuid() << "} euid{" << geteuid() <<"}" << endl;
	}
	
	return 0;
}
运行效果
[sean@CentOS code]$ g++ main.cpp
[sean@CentOS code]$ ll
total 20
-rwxr-xr-x 1 sean sean 9104 Dec 31 10:50 test
---------- 1 sean sean  670 Dec 31 10:17 main.cpp
[sean@CentOS code]$ ./test
try to change: uid{1001} euid{1001}
change failed: uid{1001} euid{1001}
# 注:此时没有改为正确的权限,setuid会失败,切root修改权限
[sean@CentOS code]$ su - root
[root@CentOS code]# chown root:root test
[root@CentOS code]# chmod 4755 test
[root@CentOS code]# ll
total 20
-rwsr-xr-x 1 root root 9104 Dec 31 10:50 test
---------- 1 sean sean  670 Dec 31 10:17 main.cpp
# 再以普通用户的身份运行程序
[sean@CentOS code]$ ./test
try to change: uid{1001} euid{0}
change success: uid{0} euid{0}  #uid=0代表获取到了root权限
change back: uid{1001} euid{1001}

因为目的是临时获取root权限,所以注意做完想要的事情之后要把原来的用户身份恢复回来,这点千万要记得!不然你用ps命令查看进程的时候会发现,它的所属用户是root,会有安全隐患。

以上就是在Linux中临时获取root权限的两种方式。

今天就分享到这里啦!感谢各位的阅读!码字不易,如果本文对你有帮助的话,帮忙点个赞吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值