Question

J'utilise un Raspberry Pi et j'aimerais créer un exécutable qui devrait simplement le redémarrer après quelques secondes.(Je prévois de le déclencher via ssh et de me déconnecter avant le redémarrage réel)

J'ai créé un exécutable en C++ avec le contenu :

#include <cstdlib>

int main () {
    system("sleep 5");
    system("reboot");
    return 0;
}

ls -l de l'exécutable résultant :

---s--x--x 1 root ben 6191 Jan 10 15:42 reboot

Mon plan était maintenant d'utiliser le bit setuid en combinaison avec la racine en tant que propriétaire du binaire afin que la commande de redémarrage puisse être exécutée par n'importe quel utilisateur.

Malheureusement, cela ne fonctionne pas et lors de l'exécution du programme, cela me donne :

Failed to issue method call: Access denied
Must be root.

Une explication sur pourquoi cela ne fonctionne pas ?

Je sais qu'il pourrait y avoir des moyens plus simples de procéder.Cette question vise vraiment à comprendre pourquoi cette méthode ne fonctionne pas.

Merci d'avance et Cordialement

Était-ce utile?

La solution

J'ai eu un problème similaire avec setuid bit et certaines versions de bash.Dans mon cas, la solution était d'écrire le programme comme ceci :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  // circumvent busybox ash dropping privileges
  uid_t uid = geteuid();
  setreuid(uid, uid);

  system("do something....");
  return 0;
}

J'espère que cela vous aidera aussi.

Autres conseils

Bien que cela ne réponde pas directement à votre question, que diriez-vous de permettre aux utilisateurs d'exécuter shutdown avec sudo?Vous pouvez même spécifier les options qu'ils sont autorisés à utiliser (voir le sudoers(5) page de manuel).Ou créez un script wrapper avec les arguments appropriés et laissez les utilisateurs l'exécuter.Il peut même vérifier s'il dispose des droits appropriés et tenter de se réexécuter via sudo si nécessaire:

#!/bin/sh
if test `id -u` -eq 0; then
    # do your stuff - shutdown, poweroff, whatever
else
    exec sudo $0 "$@"
fi

Selon ce document, system() en fait, il appelle /bin/sh, qui, sur certaines distributions, ignore l'option de bit Set-UID.

Vous pourriez essayer d'utiliser exec() plutôt que system() et invoque directement /sbin/shutdown?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top