Eu fiz alguns scripts contendo algumas funções que, por design, precisam de permissão sudo. Eu adicionei esses caminhos em .bashrc
for Linux
e .bash_profile
for MacOS
para que ele possa ser chamado de qualquer lugar.
Mas não quero que o usuário digite sudo
toda vez que quiser chamar essas funções de script. Existe alguma maneira que eu possa implicar sudo
de uma maneira que sempre que essas funções forem chamadas, o terminal assumirá que está sendo chamado pelo usuário root?
Acho que devo apenas adicionar sudo -i
no início do script ou talvez cada função? Ou existe alguma outra maneira alternativa de implicar sudo
? Além disso, seria ótimo saber se você acha que seria terrível ou perigoso sugerir sudo e se não é recomendado.
Um exemplo de dangerous-function
script que contém algumas funções que estou tentando realizar sem especificarsudo
#!/bin/bash
start-one()
{
## do dangerous stuff with sudo
systemctl start dangerous.service
}
start-two()
{
systemctl start dangerous1.service
}
start-launchwizard()
{
systemctl start dangerous2.service
}
## Calling functions one by one...
"$@"
Eu não quero chamá-los por sudo dangerous-function start-one
eu só quero chamá-los com, dangerous-function start-one
mas ainda obter o mesmo resultado que o anterior.
O
"$@"
será expandido para a lista de argumentos de linha de comando, citados individualmente. Isso significa que se você chamar seu script comele será executado
start-one
nesse ponto (que é sua função). Isso também significa que invocá-lo comoiria rodar
ls
.Permitir que um usuário invoque o script usando
sudo
(ou usandosudo
dentro do script) permitiria que ele executasse qualquer comando como root, se tivessesudo
acesso. Você não quer isso.Em vez disso, você precisaria validar cuidadosamente os argumentos da linha de comando. Talvez algo como
Teste:
Isso seria mais seguro de usar com
sudo
, mas você ainda não desejaria executar nada que o usuário fornecesse a você dentro de suas várias funções diretamente sem limpar a entrada. O script acima faz isso restringindo o usuário a um conjunto específico de subcomandos, e cada função que manipula um subcomando não executaeval
, ousource
seus argumentos.Deixe-me dizer isso novamente com outras palavras: O script não tenta, e não deve, tentar executar a entrada do usuário como código de forma alguma . Ele não deve tentar descobrir se um argumento corresponde a uma função no ambiente atual que ele pode executar (funções podem ter sido colocadas lá pelo ambiente de chamada) e não deve executar scripts cujos nomes de caminho foram fornecidos na linha de comando etc.
Se um script estiver executando tarefas administrativas, eu esperaria ter que executá-lo com
sudo
, e não gostaria que o próprio script me pedisse minha senha, especialmente se for um script que eu queira executar de forma não interativa ( por exemplo, de um cron job). Ou seja, um script que executa tarefas administrativas que exigem privilégios de root deve (IMHO) ser capaz de assumir que está sendo executado com os privilégios corretos desde o início.Se você quiser testar isso no script, você pode fazê-lo com
Em seguida, ele move a decisão de como executar o script com privilégios de root para o usuário do script.
Você pode adicionar seu script
/etc/sudoers
(de preferência usando `visudo) para que seja acessível ao usuário.Então o usuário poderá executar
path/to/script
sem sudo.