2009-11-09 02:37:00 +0000 2009-11-09 02:37:00 +0000
123
123

sudo com senha em uma linha de comando?

Em dias ocupados, eu gostaria de executar

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

à noite e ir para a cama, esperando que a aplicação fosse instalada automaticamente. Mas o que eu vejo no dia seguinte é o ecrã onde o sudo me pede a password. Então como eu poderia executar o sudo com senha em uma linha de comando, ou existe algum outro método para fazer isso?

Respostas (11)

185
185
185
2009-11-09 02:47:20 +0000

Sim, utilize o interruptor -S que lê a palavra-chave da STDIN:

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

Então, para o seu caso, pareceria o seguinte:

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

, claro, substitua <password> pela sua palavra-chave.

11
11
11
2009-11-09 03:03:22 +0000

Também pode configurar o sudo com visudo para que o utilizador possa usar o sudo sem password.

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
10
10
10
2012-08-08 06:52:50 +0000

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

Isto é um pouco complicado, mas deve funcionar:

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

Note a utilização de aspas duplas para permitir que o $USER seja expandido pela shell (não raiz).

Posso também adicionar um sleep 60 antes do comando halt. Por vezes fiz coisas como esta, esperando que o comando corra durante muito tempo, mas algo corre mal e termina imediatamente; o sleep permite-me matar o comando antes de o sistema se desligar. Ou pode usar o shutdown com um argumento de tempo.

10
10
10
2009-11-09 03:14:31 +0000

Poderá substituir a sua linha de comandos por esta:

$sudo su

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

Será imediatamente solicitado a sua palavra-passe, depois o resto dos comandos serão executados como superutilizador.

9
9
9
2014-11-25 19:43:17 +0000

Defina HISTIGNORE para “sudo -S

$ export HISTIGNORE='*sudo -S*'

Depois passe a sua palavra-passe com segurança para sudo:

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

“HISTIGNORE” significa não guardar este comando no histórico. Este é o histórico em memória ou o ficheiro “~/.bash_history”.

“-k” significa ignorar as credenciais em cache para forçar o sudo a pedir sempre a palavra-passe. Isto é 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 quiser ver os comandos que correu no histórico mais tarde, eles não estarão lá. Outro método é actualizar a cache de credenciais de autenticação do sudo (por defeito está activada com 5 minutos de intervalo), depois execute o sudo separadamente. Mas a desvantagem disto é que terá de estar ciente da 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

Nota: Executei um sudo antes de cada comando para assegurar que a cache do sudo é actualizada, uma vez que o valor por defeito é de 5 minutos. Sim, whoami não deve demorar 5 minutos, mas calculo que mais vale tê-lo executado antes de cada comando para garantir a consistência. Pode também colocar “export HISTIGNORE=‘sudo -S’” no seu ficheiro ~/.bashrc, depois carregue-o com “. ~/.bashrc” ou logoff, depois faça o login. No entanto, estou a pensar usar isto para fins de scripting, por isso vou mantê-lo no topo de todos os meus scripts para as melhores práticas de segurança. Definir “echo ”“ | sudo -S -v” para uma variável em vez disso também pode ser uma boa ideia, depois basta correr a variável antes de cada comando que precisa de privilégios de root, veja o comentário do Janar. O comentário de “John T” também deve incluir o parâmetro “-k”, como se executasse “sudo -S” sem “-k” e a cache de autenticação sudo já tem as suas credenciais (e ainda é válida, a cache de autenticação sudo por defeito é de 5 minutos) então a bash irá executar a sua palavra-passe como um comando em vez disso, o que é mau.

5
5
5
2015-06-09 14:15:37 +0000

Também pode fazer isto:

sudo -S <<< "password" command
4
4
4
2014-12-08 15:18:13 +0000

Nota, descobri que este método não funciona numa versão antiga do sudo, especificamente “Sudo versão 1.6.7p5”:

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

Onde, como este método funciona em versões antigas e novas do sudo:

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
2
2
2
2011-04-19 23:56:23 +0000

Se quiser ter mais cuidado, pode fazer um script, alterar as permissões do ficheiro para que apenas o root possa ler e editar e depois apenas executá-lo.

Exemplo: 1) Criar um ficheiro:

gedit ~/.easy.install

2) Colar isto e guardar:

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

3) Torná-lo executável:

sudo chmod +x ~/.easy.install

4) Alterar as permissões do ficheiro para que apenas o root o possa ler e editar:

sudo chmod 700 ~/.easy.install

5) Correr:

~/.easy.install

Desfrutar ;-)

1
1
1
2010-11-10 03:37:15 +0000

Criar um sudo desse tipo é perigoso se alguém vir que o sudo não requer uma senha na sua conta. A menos que você saiba o que está fazendo, não faça isso. Já me aconteceu muitas vezes no meu programa de treino local A+ com o meu computador experimental… –

O que John T. disse soa bem no entanto, só que ainda há o risco de encontrar a senha no histórico da shell. O que o CarlF disse soa melhor, mas se um comando falhar, o computador continuará a correr com privilégios de superutilizador.

0
0
0
2018-11-08 16:51:03 +0000

O problema está resolvido. Por exemplo, para a raiz do utilizador:

echo -e 'password\npassword\n' | sudo passwd root
0
0
0
2014-06-29 20:57:36 +0000

Pessoalmente faço o mesmo que John T respondeu em 9 de Novembro de 2009 às 2:47, também melhorei a minha de acordo com a orientação da sua resposta, obrigado.

A diferença é que eu tendo a 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 a minha variável em vez do sudo,

$AutoSuDo apt-get update;

Isso vem bastante a calhar com alguns guiões mais longos. Eu utilizo-os principalmente para computadores pessoais de outros, que tenho de manter.

Também recomendo que preste atenção em:

  • resposta desgua em 19 de Abril ‘11 às 23:56
  • comentário do utilizador224306 em 14 de Maio '13 às 17:38 para resposta de John T em 9 de Novembro '09 às 2:47