2010-04-20 10 views
13

Tengo una GUI de Qt 4 donde necesito tener una opción en un menú desplegable que le permita al usuario elegir reiniciar la computadora. Me doy cuenta de que esto puede parecer redundante con la capacidad de reiniciar la computadora de otras maneras, pero la elección debe permanecer allí. He intentado usar el sistema() para llamar al siguiente:¿Cómo reiniciar Linux desde dentro de un programa C++?

  1. un suid-root shell script
  2. un script de shell no suid
  3. un suid-root programa binario

y todos ellos solo causan que se imprima

reboot: must be superuser
. Usar system() para llamar al reinicio directamente hace lo mismo. No estoy especialmente apegado al uso de system() para hacer esto, pero me pareció la opción más directa.

¿Cómo puedo reiniciar el sistema desde la GUI?

+13

printf ("Por favor, presione el botón de reinicio ahora"); –

+2

¿Has intentado ejecutarlo como superusuario? – fingerprint211b

+7

Hay muchas maneras de hacer esto en Windows, pero la mayoría no son intencionales – RickNotFred

Respuesta

5

¿Ha intentado ejecutar un script de shell, usando gksudo? Algo así como

gksudo shutdown -r 

Con un poco de suerte, debería aparecer un diálogo modal para obtener las credenciales del usuario.

+0

Bueno, realmente no necesita ejecutarlo como un script de shell, solo 'execv', o si realmente desea la funcionalidad PATH que acompaña a los scripts de shell, 'execvp'. – Cascabel

0

En binaria intento para llamar

setuid (0); 

antes de sistema de llamada().

+0

Gracias por la sugerencia, pero esto no funcionó cuando se llamó al programa desde otro programa. Sin embargo, funciona si un programa se llama directamente desde la línea de comandos. –

0

¿cómo reiniciarías el sistema desde la línea de comandos de tu sistema?

básicamente hacer

system(<however you wouuld do it from the command line>); 
+1

Gracias por la sugerencia, pero eso es lo que hemos intentado, y no funciona. –

1

shell scripts suid-ción es sólo peligroso como ya se ha mencionado (que es por eso no funcionó).

Sospecho que suid-ing el binario no funciona porque el sistema genera su subproceso con el uid real del usuario y no el suid uno, de nuevo por razones de seguridad (le permitiría sustituir cualquier binario por el que se llama y ejecutarlo como root).

Puede poner una copia del reinicio en una ubicación protegida de manera que solo los usuarios que desee tener permiso puedan ejecutarla, y luego suid-root ESO.

Alternativamente darles sudoer privilegio de ejecutar justo el comando que se preocupan por el sistema y salir a algo así como "ksh -c 'sudo reboot'"

7

En Linux:

#define LINUX_REBOOT_CMD_POWER_OFF 0x4321fedc 

sync(); 
reboot(LINUX_REBOOT_CMD_POWER_OFF); 
+4

Si está utilizando la versión glibc, #include debe incluirse en el código anterior ... si es así, simplemente use #define RB_POWER_OFF en ese archivo de encabezado ... – AceFunk

+0

Esto funciona para Minix 3 también –

8

La función reboot se describe en el Linux Programmer's Manual. Debajo de glibc, puede pasar la constante de macro RB_AUTOBOOT para realizar el reinicio.

Tenga en cuenta que si reboot no va precedido de una llamada al sync, es posible que se pierdan datos.

Usando glibc en Linux:

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

sync(); 
reboot(RB_AUTOBOOT); 
0

Esto debe hacerlo en casi cualquier sistema Linux.

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

int main() { 
    sync(); 
    setuid(0); 
    reboot(RB_AUTOBOOT); 
    return(0); 
} 

A continuación, sólo compila con gcc reboot.c -o reboot y hacer chmod a+s reboot en el binario. Luego llame al reinicio como cualquier usuario y el sistema debería reiniciarse sin problemas. La forma en que haces esto a través de tu GUI varía, como si tu entorno de escritorio fuera KDE, por ejemplo, es bastante diferente de hacer lo mismo en Fluxbox.

Cuestiones relacionadas