É muito insensato criar uma falha de segurança elevando os direitos (algo que eu me oponho) sem qualquer forma de verificação de identidade, mas se o script não for interativo e o sistema estiver no controle total do script (isso significa que o usuário não pode mexer com ele), existem várias maneiras de fazer isso de forma segura. Eu te dou alguns exemplos usando uma espécie de "gatilhos de eventos" improvisados
(sim, esticar um pouco a definição)
Este deve ser iniciado antes pelo servidor (em / etc / rclocal ou algo assim) este script tem permissão "root".
#!/bin/bash
CMD="/path/to/a/directory/the/user/has/rights/to/write/into"
mkdir -p "$CMD"
while :
do
inotifywait -q -e moved_to "$CMD" >/dev/null
/path/to/script/you/want/to/run.sh
done
O segundo é o script que o usuário invoca, não tem permissão de root:
#!/bin/bash
CMD="/path/to/a/directory/the/user/has/rights/to/write/into"
touch dummyfile ; mv dummyfile "$CMD"
Como você pode ver, o usuário não tem direitos elevados e também não pode fazer nada além de "apertar o botão". Se o cliente estiver movendo alguma coisa no diretório preparado, o servercript recebe um sinal de que precisa executar seu script.
Outra maneira (menos segura) de fazer isso é usando sockets:
Primeiro, novamente, um script chamado pelo servidor (assim como no primeiro exemplo)
#!/bin/bash
PORTNUMBER="12345" #or whatever you like and not in use
while :
do
nc -l localhost $PORTNUMBER >/dev/null
/path/to/script/you/want/to/run.sh
done
então um clientcript
#!/bin/bash
PORTNUMBER="12345" #or whatever you like and not in use
echo "something" | nc localhost $PORTNUMBER
a última linha também pode ser substituída por:
echo "something" >/dev/tcp/localhost/$PORTNUMBER
Aqui novamente: um eco para um soquete sinalizará o servercript para executar seu script.
E é claro que isso também pode ser feito com pipes nomeados, mas você tem a idéia: -)