麒麟系統下,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";
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章