Eu tenho um script que executa três funções: A && B && C
.
A função B
precisa ser executada como superusuário, enquanto A
e C
não.
Eu tenho várias soluções, mas nenhuma delas é satisfatória:
sudo o script inteiro:
sudo 'A && B && C'
Parece uma má ideia executar
A
eC
como superusuário, se não for necessáriotorne o script interativo:
A && sudo B && C
Talvez eu precise digitar minha senha, mas quero que meu script não seja interativo, pois cada função pode levar algum tempo e não quero que o script espere por mim. Bem, é também por isso que é um script, para que eu não precise assistir.
A solução estúpida:
sudo : && A && sudo -n B && C
Primeiro, parece estúpido fazer um não-op
sudo
primeiro, e também devo cruzar o dedo que A não vai demorar mais do que$sudo_timeout
.Solução hipotética (gostaria que você me dissesse que existe):
sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'
Isso solicitaria minha senha no início e, em seguida, usaria essas credenciais somente quando necessário.
Qual a sua opinião sobre tudo isso? Eu ficaria muito surpreso por não haver solução para esse problema, pois acho que é um problema bastante comum (e quanto a make all && sudo make install
)
fonte
A
eC
partes explicitamente usandosu -l some_non_priviliged_user
. Sem problemas de tempo limite e sem privilégios para A e C. Não acho que 4 seja possível,sudo
parece um "estado global" para um usuário.Respostas:
Eu acho que a melhor coisa que você pode fazer é iniciar o script
sudo
e, em seguida, iniciar os processos que você deseja executar como um usuário normal explicitamente comsu user
ousudo -u user
:fonte
Inclua seu script no
/etc/sudoers
arquivo com oNOPASSWD
atributo, para que ele possa ser executado sem solicitar uma senha. Você pode vincular isso a um usuário específico (ou conjunto de usuários) ou permitir que ele seja executadosudo
por qualquer pessoa em seu sistema.Uma linha de amostra para um script chamado
/usr/local/bin/bossy
pode ser algo como istoE você usaria algo assim
Para este exemplo, assumi que
PATH
inclui/usr/local/bin
. Caso contrário, use o caminho completo para o script, ou seja,sudo /usr/local/bin/bossy
fonte
Você pode querer usar a
!requiretty
opçãosudo
assim como aNOPASSWD
opção. Mas lembre-se de que isso reduz a segurança.fonte
/etc/sudoers
entrada para o usuário a executar o comandoB
comNOPASSWD
é a resposta certa.Com base na minha resposta para pré-autorizar o sudo? (Para que possa ser executado posteriormente) , escreva dois scripts:
ABC_script
:B_script
:Execute
./ABC_script
:sudo -b ./B_script
. Isso solicita a senha ( imediatamente após a execuçãoABC_script
). Assumindo que a senha correta foi inserida, ela geraB_script
no fundo b (porque-b
foi especificada) como raiz. Isso parece ser equivalente asudo sh -c "./B_script &"
.B_script
começa a ser executado de forma assíncrona, em paralelo comABC_script
.B_script
testa a existência de um arquivo chamadoA_is_done
e faz um loop até aparecer.ABC_script
é executadoA
. Se / quandoA
terminar com êxito, o script criará um arquivo chamadoA_is_done
.ABC_script
depois testa a existência de um arquivo chamadoB_is_done
e faz um loop até aparecer.B_script
detecta a existênciaA_is_done
e rompe o loop. Exclui oA_is_done
arquivo e é executadoB
. Lembre-se,B_script
está sendo executado como root, por isso é executadoB
como root. Se / quandoB
terminar com êxito, o script cria um arquivo chamadoB_is_done
e sai.ABC_script
detecta a existênciaB_is_done
e rompe o loop. Exclui oB_is_done
arquivo. Lembre-se de que foiB_script
executado como root, portanto, eleB_is_done
pertence ao root e você deseja usá-lorm -f
para evitar a solicitação de confirmação.ABC_script
depois correC
e sai.Notas para aperfeiçoamento adicional:
ABC_script
provavelmente deve ser executadoB_script
por um caminho absoluto e não./
.A_is_done
eB_is_done
,ABC_script
provavelmente deve gerar nomes de arquivos aleatórios e únicos.É necessário que haja uma provisão para que o script que está aguardando rotação seja notificado se o programa que está aguardando foi concluído, mas falhou. (No momento, se
A
falhar, os dois scripts entrarão em um loop de espera infinito.) Isso pode ser tão simples quanto mudarpara
e, em seguida, modifique as esperas de rotação para ler os
X_is_done
arquivos e continue se ele contiver 0 e saia do contrário.fonte
Seja burro. use muitas linhas.
fonte
&&
A && sudo B && C
. Assim como Antoine explica na pergunta; isso não pede a senha atéA
que termine, e ele não deseja esperar por isso ou o script espera por ele.