Eu tenho um script bash de longa e longa execução, em que vários comandos precisam ser executados como root, enquanto a maioria dos comandos precisa ser executada como usuário comum antes do sudo, porque isso atrapalharia a propriedade do arquivo.
Eu vim com alguns métodos, mas cada um deles tem alguns problemas
Método 1: usando o sudo dentro do arquivo
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Isso ficaria bom, da maneira como o código é escrito. sudo
é escrito antes das poucas instruções que realmente precisam ser executadas pelo root, mas se o tempo entre cada sudo
chamada for muito longo sudo
novamente solicitará uma senha. Além disso, se a primeira execução de sudo
falha, por exemplo, devido a uma senha inválida, o restante do script ainda é executado.
Método 2: usando o sudo para chamar o arquivo e, em seguida, volte ao usuário original quando necessário
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Isso também é péssimo, porque eu preciso adicionar su username -c
na frente de quase todas as linhas. Também sudo
é possível encontrar o nome de usuário original depois , mas complicado.
Existe uma maneira melhor?
Edit: Eu publiquei apenas pequenos scripts sem sentido aqui para mostrar o que estou falando. No script atual, eu tenho algumas linhas que precisam do sudo (iniciando e parando serviços), algumas linhas em que não importa se existe sudo e muitas linhas que realmente precisam ser executadas sem o sudo.
sudo
se ele precisar ter permissões elevadas. Mas não há sentido em mudarsu username -c
para executar umecho
. Em outras palavras, isso soa como um [XY]. Você pode editar e explicar o que seu script realmente fará e por que você sente que precisa trocar de usuário com tanta frequência?man sudo
?-v, --validate
'Atualize as credenciais em cache do usuário, autenticando o usuário, se necessário. Para o plug-in sudoers, isso prolonga o tempo limite do sudo por mais 15 minutos por padrão, mas não executa um comando. Nem todas as políticas de segurança suportam credenciais em cache. (Se você executá-lo com bastante frequência, a autenticação sudo não deve tempo limite.)Respostas:
Em relação ao método 2, é mais fácil usar uma função. Por exemplo:
$SUDO_USER
é o nome de usuário do sudoer. Você também pode usar$(logname)
em seu lugar.Correndo na minha máquina:
fonte
Ao ler
man sudoers
, vê-se:Assim, você pode permitir que o
regular
hostmachine1
executecommand1
ecommand2
como root, sem autenticação de senha com:mas leia cada um deles
man -k sudo
para obter detalhes.fonte
Talvez isso possa ajudar:
chmod 775 herscript.sh
Então você pode usar o sudo dentro do script (sem solicitação de senha) E não pode usar o sudo para outros comandos dentro do seu script.
fonte
chmod 775
permite apenas executar o arquivo e não altera o usuário que está executando o arquivo ou seus direitos.