sudo e SUID são muito inseguros . É possível - e, dependendo da linguagem de script, fácil - escapar de qualquer um deles. O SUID é de longe o pior, e algumas linguagens de script nem serão executadas se isso for feito.
Eu tenho um post no blog sobre como fazê-lo com segurança, que eu escrevi primeiro para executando Nagios check plugins como root mas é perfeitamente aplicável aqui. Há um pequeno programa em C (que está flutuando no mundo administrativo do Linux há anos) que apenas funciona como um wrapper em torno do script. Você acabou de editar o código-fonte do programa C para incluir o caminho completo para o script, compilá-lo e, em seguida, definir esse SUID (ou fornecer acesso sudo a ele). A fonte está no meu site: setuid-prog.c .
O problema inerente à execução de scripts como raiz (para usuários não-raiz) é que em muitas linguagens, usando uma variedade de técnicas (de baixa verificação de entrada a sobrecargas) pode ser possível sair do script em execução e obter acesso root completo. Muitos caras antigos do Unix recomendam apenas escrever um programa em C para fazer o que você precisa - mas, novamente, a maioria deles era SA quando você precisava para poder escrever C com competência.