2012-04-10 51 views
2

我正在写一个QT应用程序,它有一个关机按钮。我想用此按钮关闭系统,但是当我使用shell命令“shutdown -h now”时,系统要求输入密码。
我想关闭没有密码。系统在ubuntu中无密码关机11.04

我的QT代码:

QObject *parent; 
myProcess = new QProcess(this); 
QString command= "sudo shutdown"; 
QStringList arguments; 
arguments << "-h " << "now" ; 
myProcess->start(command,arguments); 
+0

你有没有想过权限?要么你让程序setuid(坏主意),make'/ sbin/shutdown' setuid(坏主意),要么将当前用户添加到'/ etc/sudoers'文件,以便你可以从你的'sudo/sbin/shutdown'运行程序(麻烦)。 – trojanfoe 2012-04-10 11:24:45

回答

3

确保运行该进程的用户位于sudoers文件中。 使用visudo改变sudoers文件,并添加类似以下内容:

<username> ALL = NOPASSWD: /sbin/shutdown 

心连心

+0

对于那些有这个命令有问题的人......你可能需要将它作为sudoers文件的最后一行。如果其后有任何其他命令,它们可能会发生干扰。 – TrentCoder 2012-12-26 04:43:23

+0

您还必须在/ etc/sudoers中添加以下内容 默认值exempt_group = 2014-01-10 10:29:49

1

调用shell命令,你可以直接拨打电话重启暂停或重启系统代替。请参阅“man 2 reboot”。但是,如果用户没有CAP_SYS_BOOT功能,您仍然会收到权限错误。使用sudo或suid二进制文件,如上面注释中所述,您将获得此功能(以及更多)。

您还可以使用setcap程序或类似方法为您的二进制文件设置CAP_SYS_BOOT功能。请记住,每次重新编译程序后都必须完成此操作,并且必须使用sudo来使用setcap。

2

看看通过gksudo/kdesudo调用reboot,其中之一应该在大多数Linux上安装。 他们是简单的包装,会要求用户输入密码以确认提升权限为root,在您的情况下,请拨打rebootshutdown

只要与系统的其他部分一起玩,并让shutdown询问用户密码。