sudo com senha em uma linha de comando?

89

Em dias corridos, gostaria de correr

$ ./configure && make && sudo make install && halt

na noite e ir para a cama, esperando que o aplicativo seja instalado automaticamente. Mas o que vejo no dia seguinte é a tela onde o sudo me pede a senha. Então, como eu poderia rodar sudo com senha em uma linha de comando, ou há algum outro método para fazer isso?

    
por Jichao 09.11.2009 / 03:37

10 respostas

130

Sim, use a opção -S que lê a senha de STDIN:

$echo <password> | sudo -S <command>

Então, para o seu caso, ficaria assim:

$./configure && make && echo <password> | sudo -S make install && halt

é claro, substitua <password> pela sua senha.

    
por 09.11.2009 / 03:47
9

Você também pode configurar o sudo com visudo para permitir que o usuário use o make como sudo sem senha.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
    
por 09.11.2009 / 04:03
9

Várias das outras soluções têm a desvantagem de executar desnecessariamente ./configure e make como raiz.

Isso é um pouco confuso, mas deve funcionar:

sudo sh -c "su $USER -c ./configure && su $USER -c make && make install && halt"

Observe o uso de aspas duplas para permitir que $USER seja expandido pelo shell (não raiz).

Também posso adicionar um sleep 60 antes do comando halt . Eu às vezes fiz coisas como essa, esperando que o comando seja executado por um longo tempo, mas algo dá errado e termina imediatamente; o sleep me deixa matar o comando antes que o sistema seja desligado. Ou você pode usar shutdown com um argumento de tempo.

    
por 08.08.2012 / 08:52
8

Você pode substituir sua linha de comando por:

$sudo su

$./configure && make && make install && halt

Você será solicitado a fornecer sua senha imediatamente e, em seguida, o restante dos comandos será executado como superusuário.

    
por 09.11.2009 / 04:14
5

Defina HISTIGNORE como " sudo -S "

$ export HISTIGNORE='*sudo -S*'

Em seguida, passe sua senha com segurança para o sudo:

$ echo "your_password" | sudo -S -k <command>

"HISTIGNORE" significa não salvar este comando no histórico. Esse é o histórico na memória ou no arquivo "~ / .bash_history".

Por exemplo, o abaixo irá passar sua senha com segurança para o comando sudo, sem mantendo um histórico da sua senha.

“- S” significa usar stdin para a senha,

“- k” significa ignorar as credenciais em cache para forçar o sudo para sempre perguntar. Isso é para um comportamento consistente.

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -k whoami
$ echo "<your_password>" | sudo -S -k cat /etc/shadow
$ echo "<your_password>" | sudo -S -k bash /tmp/myscript.sh

A desvantagem do método acima é que, se você quiser ver os comandos que você executou no histórico mais tarde, eles não estarão lá. Outro método é atualizar o cache de credenciais de autenticação sudo (o padrão é ativado com tempo limite de 5 minutos) e, em seguida, executar o sudo separadamente. Mas o lado negativo disso é que você precisa estar ciente do cache de 5 minutos.

Por exemplo:

$ export HISTIGNORE='*sudo -S*'
$ echo "<your_password>" | sudo -S -v
$ sudo whoami
$ echo "<your_password>" | sudo -S -v
$ sudo cat /etc/shadow
$ echo "<your_password>" | sudo -S -v
$ sudo /tmp/myscript.sh

Observe que executei um sudo antes de cada comando para garantir que o cache sudo seja atualizado, pois o padrão é 5 mintues. Sim, whoami não deve demorar 5 minutos, mas acho que também deve ser executado antes de cada comando para consistência. Você também pode colocar "exportar HISTIGNORE = ' sudo -S '" no seu arquivo ~ / .bashrc, e então carregá-lo com ". ~ / .Bashrc" ou logoff e login. No entanto, estou pensando em usar isso para fins de script, por isso vou mantê-lo no topo de todos os meus scripts para melhores práticas de segurança. Configurar "echo" "| sudo -S -v" para uma variável também pode ser uma boa idéia, então apenas execute a variável antes de cada comando que precisa de privilégios de root, veja o comentário de Janar. O comentário de "John T" também deve incluir o parâmetro "-k", como se você executasse "sudo -S" sem "-k" e o cache de autenticação sudo já tivesse suas credenciais (e ainda seja válido, o cache de autenticação sudo padrão é 5 minutos) então o bash irá rodar sua senha como um comando, o que é ruim.

    
por 25.11.2014 / 20:43
2

Se você quiser ter mais cuidado, pode criar um script, alterar as permissões do arquivo para que somente o root possa ler e editar e, em seguida, apenas executá-lo.

Exemplo:
1) Crie um arquivo:

gedit ~/.easy.install  

2) Cole e salve:

./configure && make && echo <password> | sudo -S make install && halt  

3) Torne-o executável:

sudo chmod +x ~/.easy.install  

4) Altere as permissões do arquivo para que somente o root possa ler e editar:

sudo chmod 700 ~/.easy.install  

5) Executar:

~/.easy.install  

Aprecie; -)

    
por 20.04.2011 / 01:56
2

Você também pode fazer isso:

sudo -S <<< "password" command
    
por 09.06.2015 / 16:15
1

Configurar o sudo assim é perigoso se alguém descobrir que o sudo não requer senha na sua conta. A menos que você saiba o que está fazendo, não faça isso. Eu tive isso acontecer no meu programa local de Treinamento A + com meu computador experimental muitas vezes ... -_-

O que John T. disse parece bom, exceto que ainda existe o risco de encontrar a senha no histórico do shell. O que CarlF disse soa melhor, mas se um comando falhar, o computador ainda estará funcionando com privilégios de superusuário.

    
por 10.11.2010 / 04:37
1

Note que descobri que o método não funciona em uma versão antiga do sudo, especificamente "Sudo versão 1.6.7p5":

$ echo "<your_password>" | sudo -S -k whoami

Onde este método funciona em versões mais antigas e novas sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
    
por 08.12.2014 / 16:18
0
Pessoalmente eu faço exatamente o mesmo que John T respondeu em 09 de novembro de 2009 às 2:47, eu também melhorei o meu de acordo com a orientação de sua resposta, obrigado.

Diferença é que eu costumo fazer uso de variáveis, algo como:

AutoSuDo=$" $echo pass | sudo -S";
# Change AutoSuDo to something else.
# Note that string starts with space,
# useful only if used as first command in line

Dessa forma, posso facilmente usar minha variável em vez de sudo,

$AutoSuDo apt-get update;

Isso é bastante útil com alguns scripts mais longos. Eu principalmente faço uso destes para computadores pessoais de outros, que eu tenho que manter.

Eu também recomendo prestar atenção em:

  • desgua resposta em Abr 19 '11 às 23:56
  • user224306 comente em 14 de maio de 2013 às 17:38 para John T resposta em 9 de novembro de 2009, às 2:47
por 29.06.2014 / 22:57

Tags