Pergunta

Estou executando um Raspberry Pi e gostaria de criar um executável que simplesmente reinicie após alguns segundos.(Pretendo acioná-lo via ssh e sair antes que a reinicialização real ocorra)

Criei um executável com c++ com o conteúdo:

#include <cstdlib>

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

ls -l do executável resultante:

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

O meu plano agora era usar o bit setuid em combinação com o root como proprietário do binário para que o comando de reinicialização pudesse ser executado por qualquer usuário.

Infelizmente isso não está funcionando e ao executar o programa me dá:

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

Alguma explicação sobre por que isso não está funcionando?

Eu sei que pode haver maneiras mais fáceis de fazer isso.Esta questão realmente visa entender por que essa forma não está funcionando.

Desde já agradeço e cumprimentos

Foi útil?

Solução

Eu tive problema semelhante com setuid bit e algumas versões de bash.No meu caso a solução foi escrever o programa assim:

#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;
}

Espero que isso ajude você também.

Outras dicas

Embora não responda diretamente à sua pergunta, que tal permitir que os usuários executem shutdown com sudo?Você pode até especificar quais opções eles podem usar (veja o sudoers(5) página de manual).Ou crie um script wrapper com os argumentos apropriados e deixe os usuários executá-lo.Pode até verificar se possui os direitos apropriados e tentar reexecutar-se através de sudo se necessário:

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

De acordo com esse documento, system() na verdade chama /bin/sh, que, em algumas distribuições, ignora a opção Set-UID bit.

Você pode tentar usar exec() em vez de system() e invocar diretamente /sbin/shutdown?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top