Estou escrevendo um script (na verdade uma combinação de scripts e makefile) que instala dependências externas: alguns apt-get
comandos, alguns git
clonando, construindo, instalando, adicionando usuários a grupos, ...
Algumas das operações nesses scripts requerem permissões de superusuário, outras não.
Até agora, eu executei todo o processo de criação com o sudo, mas ele tem algumas desvantagens:
git
repos clono getroot
como proprietário, o que significa que não posso modificá-los posteriormente semsudo
ouchown
- os scripts que adicionam usuários a grupos não sabem qual usuário adicionar desde que
whoami
retornaroot
Qual é a melhor maneira de executar como superusuário apenas os comandos que exigem isso? Idealmente, o processo ainda exigiria que eu digite minha sudo
senha, mas apenas uma vez no início do processo de instalação. Esquecê-lo-ia no final, mas mantenha-o o tempo todo até lá (pode levar várias horas).
As soluções que encontrei online incluem:
sudo -v
no início do script, mas se eu entendi corretamente, isso expira. Meu script pode estar em execução por algumas horas- executando o script com
sudo
, mas os comandos que não precisam de superusuáriosudo -u $(logname) <command>
. É isso que faço agora, mas parece que deveria ser o contrário.
Idealmente, eu gostaria que meu script:
- solicitar credenciais de superusuário
- executar comandos normais como o usuário conectado
- execute comandos sudo com as credenciais inseridas na etapa 1
sudo -k
fechar a sessão de superusuário
SUDO_USER
variável de ambiente. Se presente, ele conterá o nome de usuário do usuário que está chamando o sudo. Então você pode (como root) mostrar $ SUDO_USER: $ SUDO_GID $ your_files. Da mesma forma, você pode verificar essas variáveis para que seus comandos adduser saibam qual usuário adicionar.su $SUDO_USER -c command
os comandos para executar como usuário normal.Respostas:
Como você tem acesso ao sudo, crie um arquivo sudoers para si mesmo e exclua-o quando o script estiver concluído:
fonte
Uma maneira, que eu geralmente não recomendaria, é ler a senha você mesmo e usar
sudo
a-S
opção para passar a senha como e quando necessário:De
man sudo
:fonte
echo "$password"
??echo "$password"
não seria, mas heredocs e herestrings são um pouco mais seguros. Eles não são visíveis na linha de comando mostrada pelas ferramentas usuais.echo "$password"
o lado esquerdo de um cachimbo está seguro em um script bash.echo
é um shell embutido;/bin/echo
não funciona quando é chamado simplesmenteecho ...
. Algumas outras conchas têm umecho
embutido (dash
por exemplo), mas as conchas no estilo Bourne não são precisam ter uma. Então, eu acho queecho "$password" |
é aceitável no bash, mas pode ser melhor evitado no caso de alguém portar o script para outro shell sem perceber o problema. Eu uso um não-portáteis[[
, em vez de[
em que o script para evitar o mesmo tipo de problema. @KasiyA