系统:ubuntu
开发环境:Qt Creator
通过命令来实现系统关机,执行命令 “sudo shutdown -h now” ,但是会需要输入密码后才能实现关机。下面我们来介绍一些免密的方法。
测试方法:用 qt 创建一个界面项目,增加一个按钮,在按钮的槽方法中测试。
#! /bin/bash
sudo shutdown -h now
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)弹出终端,提示输入密码。
如果你输入正确的密码,系统就会立马关机。但是这不是我们想要的,我们想要的是免密关机。下面接着介绍。
(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自身的,不能识别这两种符号。
#! /bin/bash
echo '123456'|sudo -S shutdown -h now
其中 '123456' 即是你的密码,此步骤其实就是自动将密码匹配。
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自身的,不能识别这两种符号。