Linux 多种“Qt中实现免密关机、重启”方法

系统:ubuntu

开发环境:Qt Creator

通过命令来实现系统关机,执行命令 “sudo shutdown -h now” ,但是会需要输入密码后才能实现关机。下面我们来介绍一些免密的方法。

测试方法:用 qt 创建一个界面项目,增加一个按钮,在按钮的槽方法中测试。

方法一

1、在/home/hostname (其中 hostname 为系统的主机名)目录下创建 shutdown.sh 文件,并写入以下内容:

#! /bin/bash
sudo shutdown -h now

2、在按钮的槽方法中输入执行 shutdown.sh的命令:

void MainWindow::on_pushButton_clicked()
{
    system("gnome-terminal -x bash -c '/home/hd/shutdown.sh'&");
}

其中关于gnome-terminal 的相关命令介绍,参考链接https://blog.csdn.net/limanjihe/article/details/49794601

也可使用以下方式执行shutdown.sh :

void MainWindow::on_pushButton_clicked()
{
    system("/home/hd/shutdown.sh");
}

注意:到这一步,还没有完成。有以下2点注意:

(1)如果运行程序,点击按钮没有任何反应。

可能是 shutdown.sh 文件在创建时,没有可执行权限,需要对它赋予可执行权限,使用以下指令:

chmod a+x shutdown.sh 

赋予权限后,再次执行程序,点击按钮,会有反馈,但是不是关机,而是弹出终端让你输入密码。这是我写到的下一个需要注意的问题。

(2)弹出终端,提示输入密码。

如果你输入正确的密码,系统就会立马关机。但是这不是我们想要的,我们想要的是免密关机。下面接着介绍。

3、免密操作

(1)打开终端,执行以下命令,去编辑 sudoers 文件:

cd /etc
sudo vim sudoers

这里用的是 vim 编辑器,如果你的系统里没有 vim 编辑器,可以执行以下命令安装 vim 编辑器(前提是已联网):

sudo apt install vim

当然,我们也可以使用 Linux 自带的编辑器 vi ,这样也不用安装 vim 了:

cd /etc
sudo vi sudoers

(2)在文件最后添加如下命令(vi 插入命令为 i ):

hd hdpc=NOPASSWD: /sbin/shutdown -h now

其中 hd 为当前用户名,hdpc 为主机名;

如果要实现重启系统,使用以下命令: 

hd hdpc=NOPASSWD: /sbin/reboot

如果想同时实现关机和重启,使用以下命令:

hd hdpc=NOPASSWD: /sbin/shutdown -h now,/sbin/reboot

(3)因为 sudoers 是只读状态,需要在保存指令后加上 ! 

先按 Esc 按键,输入以下命令:

:wq!

保存退出。

最后,再次执行程序,点击按钮,实现系统关机。

方法二

方法二 是基于 方法一 更改的。

方法一 中的 第1、第2步骤中执行 shutdown.sh 文件,目的是执行命令 “sudo shutdown -h now”,而 方法二 就是直接在按钮的槽方法中执行命令 “sudo shutdown -h now” ,具体实现如下【注意:代替了方法一中的第1、第2步骤,但是依然使用第3步骤,这一步免密操作是不能少的】:

void MainWindow::on_pushButton_clicked()
{
    system("sudo shutdown -h now");
}

或者使用 qt 的QProcess 的 execute方法(包含 QProcess 头文件) :

void MainWindow::on_pushButton_clicked()
{
    QProcess:execute("sudo shutdown -h now");
}

或者使用 qt 的QProcess 的 start 方法(包含 QProcess 头文件) ,因我未测试,所以不写出来了,有兴趣的可以研究一下。

注意:

以上三种方法中,前两种(system 和 execute)会阻塞进程,直到命令执行结束,而第三种(start )不会阻塞进程,可以多任务运行。当命令中存在管道(|)和重定向(>)时,只能使用system 方式,其他两种属于Qt自身的,不能识别这两种符号。

 

方法三

1、在/home/hostname (其中 hostname 为系统的主机名)目录下创建 shutdown.sh 文件,并写入以下内容:

#! /bin/bash
echo '123456'|sudo -S shutdown -h now

其中 '123456' 即是你的密码,此步骤其实就是自动将密码匹配。

2、在按钮的槽方法中输入执行 shutdown.sh的命令:

void MainWindow::on_pushButton_clicked()
{
    system("gnome-terminal -x bash -c '/home/hd/shutdown.sh'&");
}

其中关于gnome-terminal 的相关命令介绍,参考链接https://blog.csdn.net/limanjihe/article/details/49794601

也可使用以下方式执行shutdown.sh :

void MainWindow::on_pushButton_clicked()
{
    system("/home/hd/shutdown.sh");
}

最后,运行程序,点击按钮,实现关机。

 

方法四

方法四 是 方法三的更改。

直接在按钮的槽方法里执行命令,代替了执行 sh 文件操作:

void MainWindow::on_pushButton_clicked()
{
    system("echo '123456'|sudo -S shutdown -h now");
}

或者使用 qt 的QProcess 的 execute方法(包含 QProcess 头文件) :

void MainWindow::on_pushButton_clicked()
{
    QProcess:execute("echo '123456'|sudo -S shutdown -h now");
}

或者使用 qt 的QProcess 的 start 方法(包含 QProcess 头文件) ,因我未测试,所以不写出来了,有兴趣的可以研究一下。

注意:

以上三种方法中,前两种(system 和 execute)会阻塞进程,直到命令执行结束,而第三种(start )不会阻塞进程,可以多任务运行。当命令中存在管道(|)和重定向(>)时,只能使用system 方式,其他两种属于Qt自身的,不能识别这两种符号。

你可能感兴趣的:(Qt开发,Linux,Linux,多种“Qt中实现免密关机,重启”方法,ubuntu,多种“Qt中实现免密关机,重启”方法,Linux,Qt中实现免密关机,重启,Linux,Qt中执行命令)