A razão mais provável é que o programa, uma vez executado como um usuário normal, está tentando ler algum arquivo ou fazer alguma operação que é reservada para usuários privilegiados (basicamente root).
Por exemplo, se seu programa está tentando usar (ligação) para uma das portas inferiores da Internet (menos de 1024), ele precisa de privilégios de root para fazer isso (1). Ou tente ler um arquivo ou use uma biblioteca marcada apenas para raiz.
A solução hammer (2) é para marcar o programa set-uid root (SUID-root). Isso é bastante perigoso, deve ser evitado codificando-se o programa para que ele não seja necessário, e é praticamente impossível distribuí-lo - eu nunca aceitaria programas programados de fontes não oficiais no meu computador, e mesmo assim eu não uso Gosta deles também. Estou postando a resposta porque acho que é bom saber que eles existem.
Portanto, certificando-se de que todos os serviços / arquivos que o programa usa estão acessíveis a ele é a solução correta, caso contrário, provavelmente, o programa deve ser executado como root com todas as conseqüências.
Aviso de grandes quantidades de gordura: isso é perigoso e os programas de raiz da SUID podem fazer o que quiserem com o sistema. Se eles tiverem bugs, o usuário pode facilmente assumir o controle de todo o sistema ou destruí-lo.
Se você criar um programa set-uid root, qualquer um poderá executá-lo e será executado como root. Isso funcionará apenas para executável binário ; bit set-uid não funciona para scripts (shell, python ou qualquer outro) .
Se você realmente quer rodar um script como root, você precisa de um wrapper, como aquele em esta resposta em stackoverflow . Mas antes de fazer isso, leia toda a questão e certifique-se de entender os (não tão) pontos finos sobre segurança. Se você realmente quer que o script seja executado como root para todos os usuários, eu optaria por editando sudoers
para que eles pudessem executá-lo com sudo
sem nenhuma senha solicitada . Esta resposta em stackoverflow lista muitas ideias.
Exemplo de uso de set-uid : Eu faço uma cópia de cat
(produzo o conteúdo de um arquivo para o terminal), altero para ser de propriedade de root e tento ler um arquivo de propriedade do root e que somente o root pode ler:
(0)asus-romano:~/tmp/suidtest% cp /bin/cat .
(0)asus-romano:~/tmp/suidtest% ls -l ./cat
-rwxr-xr-x 1 romano romano 46884 Nov 21 09:49 ./cat
(0)asus-romano:~/tmp/suidtest% sudo chown root.root ./cat
(0)asus-romano:~/tmp/suidtest% ls -l
total 48
-rwxr-xr-x 1 root root 46884 Nov 21 09:49 cat
(1)asus-romano:~/tmp/suidtest% ./cat /etc/shadow- > /dev/null
./cat: /etc/shadow-: Permission denied
Agora, eu mudo o programa para ser suid-root (observe o s
nos flags de permissão):
(0)asus-romano:~/tmp/suidtest% sudo chmod u+s ./cat
(0)asus-romano:~/tmp/suidtest% ls -l ./cat
-rwsr-xr-x 1 root root 46884 Nov 21 09:49 ./cat
(0)asus-romano:~/tmp/suidtest% ./cat /etc/shadow- > /dev/null
Nenhum erro ...
Novamente, não faça isso, a menos que você confie completamente no programa e nos usuários.
(1) bem, existem privilégios refinados no Linux chamados capacidades , mas raramente são usados e bastante complexo ...
(2) quando você tem um martelo, tudo começa a parecer prego ...