微信扫一扫 分享朋友圈

已有 808 人浏览分享

开启左侧

Linux默认以root或管理员权限启动程序方式有哪些?

[复制链接]
808 0
在进行Linux桌面端开发、系统应用开发的时候,一些可执行二进制文件经常需要管理员权限或者root权限才能进行正常工作,比如守护进程(daemon process)或者涉及USB通信、设备操作的进程。
对于系统管理员、研发或者有Linux操作经验的用户来说,可以很轻易的通过Linux命令sudo来以管理员权限启动进程。
但是,如果是一些桌面级操作系统,一些从windows习惯用户,双击图标无法正常启动,必须命令行sudo显得太不人性化(人性化也不会使用Linux)。
然而,这些你那国产Linux的趋势愈加明显,一些对Linux零基础的用户大量涌入,又不得不面对这些情况。
总结了一下常用的Linux下默认管理员权限启动可执行程序的方式

echo模拟密码输入
创建sh脚本
#!/bin/bash
echo '[password]' | sudo -S [command]

PS: sudo -S 是大写S
sudo 的-S参数,将从标准输入中读取密码

这种方式,模拟键盘输入密码进行sudo管理员权限。
缺点非常明显,必须提前知道管理员密码,而且在后续的使用过程中一旦密码变换就失效。完全不是民用Linux程序的方式
一般只用作Linux进阶用户避免繁琐sudo操作的方法

pkexec (桌面环境)
创建sh脚本
#!/bin/bash
pkexec [command]

桌面弹出密码输入框,正确后获得管理员权限执行command
这种方式,可以直接弹出类似Ubuntu、Fedora一些Linux操作系统的输入密码的窗口,只有正确输入才能启动后续的命令。
一般情况下,这种方法足以应对大部分民用Linux程序的管理员权限获取。
suid 权限(风险漏洞高)

如果启动程序前,连密码都不想输入,就想直接获取Root权限,那么suid确实是一种方法,但这种方法风险极高,如果不是迫不得已的情况,建议不要使用。
使用此方法前,先介绍一下Linux系统的权限规则

在Linux系统
一个文件有三种权限属性
    读(r-read)
    写(w-write)
    执行(x-excute)

一个文件又有三种归属
    所有者(owner)
    同组者(group)
    其他(other)

在Linux命令行中执行 ls -l ,就可以看到一个文件的三种属者对该文件所拥有的权限
例如
drwxr-xr-- dir
-rw-rw---- file
-rwxrwxrwx exe

执行ls-l命令后,可以看到最前有10个字符
    第1个字符,d-代表该文件是一个目录,-表示普通文件
    第2-4个字符,代表文件所有者owner的权限
    第5-7个字符,代表文件同组者group的权限
    第9-10个字符,代表其他人other的权限

PS: 一个目录必须有x(可执行)权限
其实,Linux文件还存在第四种权限属性,即suid属性
-rws------ exe

如果一个File文件有SUID属性,那么无论那个用户执行该File文件时,都将以该文件File的所有者(owner)权限进行执行
也就是说,如果这个文件的所有者是root,那么即便是普通用户给user在执行该文件时,Linux系统仍旧认为该文件是root用户所启动,且获得最高权限。
所以,如果我们想免密以root权限执行文件,那么我们就可以先将一个文件的所有者改变为root,然后再赋予它SUID权限即可。
该方式只针对二进制可执行文件,普通文件、脚本不可用

sudo chown root [bin] //将bin 的所有者改为root
sudo chmod a+s [bin] //所有人对bin 的执行操作,都将以所有者权限进行启动
./bin // 将以root用户启动root

Linux系统中,文件有所有者owner,所属组group的属性
一般情况下,哪个用户创建了该文件,该用户就是该文件的owner,该用户所属的group就是该文件的group。
当我们给予一个二进制可执行文件suid属性时,无论哪个用户执行该二进制文件时,实际都会以该文件的owner角色来启动。

所以,对于需要以root权限启动的文件来说。
先将该文件的owner改为root,
再赋予所有人对该文件都有suid权限(chmod s),
即可保证该文件始终以所有者root进行启动
但是该行为风险极高,慎用
Qt注意事项

Qt在Linux下的二进制可执行文件,一般是禁止赋予suid权限的。
如果需要使用suid方式,需要在程序入口,一般是main函数,QCoreApplication/QApplication进入Qt事件循环前,调用QApplication::setSetuidAllowed(true)

int main(int argc, char *argv[])
{
    QApplication::setSetuidAllowed(true);
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

该方式一般以程序打包为deb、rpm安装包的方式进行,将以上的操作放置在打包安装脚本中进行

免责声明:
1,海欣资源网所发布的资源由网友上传和分享,不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
2,海欣资源网的资源来源于网友分享,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。
3,海欣资源网所发布的资源由网友上传和分享,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。
4,如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉,联系方式邮箱 haixinst@qq.com
海欣资源-企业信息化分享平台。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

35

主题
热度排行
回复排行
最新贴子

Archiver|手机版|海欣资源 ( 湘ICP备2021008090号-1 )|网站地图

GMT+8, 2024-4-19 23:00 , Gzip On, MemCached On.

免责声明:本站所发布的资源和文章均来自网络,仅限用于学习交流和测试研究目的,不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 如果您喜欢,请支持正版,购买正版,得到更好的正版服务,如有侵权,请联系我们删除并予以真诚的道歉。