麒麟系统下,qt以root启动外部程序或文件
学习这位博主的:https://blog.csdn.net/shihoongbo/article/details/122290472。
第一种方法:不用输入root密码
echo模拟密码输入
创建sh脚本
#!/bin/bash
echo '[password]' | sudo -S [command]
PS: sudo -S 是大写S
sudo 的-S参数,将从标准输入中读取密码
这种方式,模拟键盘输入密码进行sudo管理员权限。
缺点非常明显,必须提前知道管理员密码,而且在后续的使用过程中一旦密码变换就失效。完全不是民用Linux程序的方式
一般只用作Linux进阶用户避免繁琐sudo操作的方法
第二种:会弹出个框,让手动输入root密码
pkexec (桌面环境)
创建sh脚本
#!/bin/bash
pkexec [command]
桌面弹出密码输入框,正确后获得管理员权限执行command
这种方式,可以直接弹出类似Ubuntu、Fedora一些Linux操作系统的输入密码的窗口,只有正确输入才能启动后续的命令。
一般情况下,这种方法足以应对大部分民用Linux程序的管理员权限获取。
以上方法,
第一种很好实现:sh脚本文件里:写如:echo 'rootpwd' | sudo -S ./AppRun 像这样就行。当然这种方式,用代码也可以,很不错
代码像这样:
QProcess *backupProcess = new QProcess; backupProcess->setWorkingDirectory(path); connect(backupProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(sendProcessError(QProcess::ProcessError))); QString pwd="rootpwd"; backupProcess->start(("sh -c \"echo '"+pwd+"' | sudo -S ./AppRun").toLatin1()); backupProcess->waitForStarted(); bool isfinished = backupProcess->waitForFinished(); if(isfinished){ QTextCodec* pTextCodec = QTextCodec::codecForName("System"); QByteArray qba = backupProcess->readAllStandardError(); qDebug() << "output: " << pTextCodec->toUnicode(backupProcess->readAllStandardOutput()); qDebug() << "StandardError: " << QString::fromLocal8Bit(qba); qDebug() << "StandardError1: " << pTextCodec->toUnicode(qba); backupProcess->close(); delete backupProcess; backupProcess = NULL; qDebug() << "exec linux Cmd finished"; }
第二种方法试了,不行不知道咋回事,也弹出窗口了,输入密码退出了。
第二种方式这样的,我之前在代码里实现过;代码如下(里面path+filename是要执行的脚本文件地址)
QProcess *backupProcess = new QProcess; backupProcess->setWorkingDirectory(path); connect(backupProcess, SIGNAL(error(QProcess::ProcessError)), this, SLOT(sendProcessError(QProcess::ProcessError))); backupProcess->start("pkexec /bin/bash"); backupProcess->waitForStarted(); //backupProcess->start("pkexec",QStringList() << path + fileName); //backupProcess->start("pkexec echo \"root\" > /boot/grub/test.txt"); //backupProcess->write("echo \"root\" > /boot/grub/test.txt"); QString str=QString(path+fileName+"\n"); qDebug() << str.toStdString().c_str(); backupProcess->write(str.toStdString().c_str()); bool isfinished = backupProcess->waitForFinished(); if(isfinished){ QTextCodec* pTextCodec = QTextCodec::codecForName("System"); QByteArray qba = backupProcess->readAllStandardError(); qDebug() << "output: " << pTextCodec->toUnicode(backupProcess->readAllStandardOutput()); qDebug() << "StandardError: " << QString::fromLocal8Bit(qba); qDebug() << "StandardError1: " << pTextCodec->toUnicode(qba); backupProcess->close(); delete backupProcess; backupProcess = NULL; qDebug() << "exec linux Cmd finished"; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗