17

ユーザーがコンピューターの再起動を選択できるドロップダウンメニューにオプションが必要なQt 4 GUIがあります。これは、他の方法でコンピューターを再起動する機能と冗長に思えるかもしれませんが、選択肢はそこにとどまる必要があります。system() を使用して以下を呼び出してみました:

  1. suid-root シェルスクリプト
  2. 非 suid シェルスクリプト
  3. suid-root バイナリ プログラム

そして、それらすべてが原因です

再起動: スーパーユーザーでなければなりません
印刷する。system() を使用して再起動を直接呼び出すと、同じことが行われます。これを行うために system() を使用することに特に執着しているわけではありませんが、それが最も直接的な選択のように思えました。

GUI からシステムを再起動するにはどうすればよいですか?

4

7 に答える 7

15

このreboot機能については、Linux Programmer's Manualで説明されています。glibcの下で、RB_AUTOBOOTマクロ定数を渡して再起動を実行できます。

rebootの呼び出しが の前にない場合sync、データが失われる可能性があることに注意してください。

Linuxでglibcを使用する:

#include <unistd.h>
#include <sys/reboot.h>

sync();
reboot(RB_AUTOBOOT);
于 2013-09-12T14:15:06.320 に答える
8

Linux の場合:

#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc   

sync();
reboot(LINUX_REBOOT_CMD_POWER_OFF);
于 2011-01-30T11:31:30.040 に答える
4

gksudoを使用してシェルスクリプトを実行してみましたか?何かのようなもの

gksudo shutdown -r

運が良ければ、モーダルダイアログを表示してユーザーの資格情報を取得する必要があります。

于 2010-04-20T21:35:25.073 に答える
1

シェルスクリプトをsuidすることは、すでに述べたように危険です(これが機能しなかった理由です)。

システムがサブプロセスをsuidではなくユーザーの実際のuidで生成するため、バイナリのsuidは機能しないと思われます。これもセキュリティ上の理由からです(呼び出されたバイナリの代わりに任意のバイナリを使用して、rootとして実行できます)。 )。

再起動のコピーを保護された場所に置いて、必要なユーザーだけがそれを実行できるようにしてから、それをsuid-rootすることができます。

代わりに、あなたが気にかけているコマンドだけを実行し、次のようなものにシステムアウトするためのsudoer特権を彼らに与えてください"ksh -c 'sudo reboot'"

于 2010-04-21T15:56:15.390 に答える
0

システムのコマンドラインからどのようにシステムを再起動しますか?

基本的に

system( <however you wouuld do it from the command line> );
于 2010-04-21T15:25:19.890 に答える
0

バイナリで呼び出してみる

setuid (0);

system() 呼び出しの前。

于 2010-04-20T21:41:28.497 に答える