sudo com senha em uma linha de comando?

115

Em dias de muito movimento, eu gostaria de correr

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

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

Jichao
fonte
Você precisa haltexecutar como root.
9788 Keith Thompson
11
Não sudotem um tempo limite de 15 minutos? Não foi possível executar, digamos, sudo lsou algo semelhante, digitar sua senha e executar o comando acima, sudoainda com privilégios ativos? (Eu não posso testar isso no momento, caso contrário, eu postaria isso como uma resposta.) #
88/08 Matt
11
O tempo limite ativado sudoé configurável. Pessoas preocupadas com a segurança (também conhecidas como paranóicas, como eu) definem o valor como zero ... :-)
dda 13/02/13

Respostas:

173

Sim, use o -Scomutador que lê a senha de STDIN:

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

Portanto, para o seu caso, seria assim:

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

é claro, substitua <password>pela sua senha.

John T
fonte
42
Obviamente, não se deseja executar isso se houver perigo de alguém ver a senha no histórico do shell.
Brett Daniel
procurando maneiras rápidas de executar comandos privilegiados em um host remoto e isso funciona graças.
nelaaro 15/09/11
13
Se você decidiu usar o 'eco <password> | opção sudo -S ', ​​para evitar expor a senha no histórico de comandos, inicie o comando com um caractere ESPAÇO. Obviamente, a melhor opção é canalizar a senha de um arquivo seguro.
Shannon Haworth
Você pode querer usar que se você tiver a senha em uma variável $ (que você poderia ter provisão com sops por exemplo)
Natim
9 anos depois e ainda funciona como um encanto :)
WinEunuuchs2Unix
10

Você pode substituir sua linha de comando por esta:

$sudo su

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

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

CarlF
fonte
8
uma alternativa (e, provavelmente, preferido) versão deste:sudo sh -c "./configure && make && make install && halt"
quack quixote
2
Mas todos os arquivos de compilação gerados não teriam permissões de superusuário? Isso impediria que você execute ./configure && make como um usuário comum posteriormente.
user45909
Sim, usuário45909, você está certo. Pessoalmente, nunca reexecutei ./configure && make, exceto depois de baixar uma atualização do pacote principal, mas provavelmente não sou típico.
CarlF
10

Várias das outras soluções têm a desvantagem de serem executadas desnecessariamente ./configuree makecomo raiz.

Isso é um pouco complicado, 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 $USERa expansão pelo shell (não raiz).

Também posso adicionar um sleep 60antes do haltcomando. Às vezes, faço coisas assim, esperando que o comando seja executado por um longo tempo, mas algo dá errado e termina imediatamente; a sleepdeixa-me matar o comando antes de o sistema é desligado. Ou você pode usar shutdowncom um argumento de tempo.

Keith Thompson
fonte
9

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

User_Alias USERS = your_user
Cmnd_Alias CMDS = /usr/bin/make
USERS ALL = (ALL) NOPASSWD: CMDS
Natim
fonte
9

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á canalizar sua senha com segurança para o comando sudo, sem manter um histórico da sua senha.

"-S" significa usar stdin para a senha,

"-K" significa ignorar credenciais em cache para forçar o sudo a 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 executados no histórico posteriormente, eles não estarão lá. Outro método é atualizar o cache de credenciais de autenticação do sudo (o padrão é ativado com tempo limite de 5 minutos) e, em seguida, execute o sudo separadamente. Mas a desvantagem disso é que você precisará 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

Nota: Eu executei um sudo antes de cada comando para garantir que o cache do sudo seja atualizado, pois o padrão é 5 minutos. Sim, whoami não deve demorar 5 minutos, mas acho que é melhor executá-lo antes de cada comando para garantir a consistência. Você também pode colocar "export HISTIGNORE = ' sudo -S'"no seu arquivo ~ / .bashrc e carregue-o com". ~ / .bashrc "ou faça logoff e faça o login. No entanto, estou pensando em usá-lo para fins de script, por isso vou mantê-lo no topo de todos os meus scripts para obter melhores práticas de segurança. Definindo" echo "" | sudo -S -v "para uma variável também pode ser uma boa idéia; basta executar a variável antes de cada comando que precise de privilégios de root, consulte 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á possua suas credenciais (e ainda é válido, o cache de autenticação sudo padrão é de 5 minutos), o bash executará sua senha como um comando, que é ruim.

user393365
fonte
11
Apenas como uma pequena observação sobre como tornar as coisas não disponíveis na história, execute seu comando com um único espaço na frente dele. Por alguma razão, isso faz com que a história a ignore.
Matt Fletcher
4

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

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

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

$ echo "<your_password>" | sudo -S -v
$ sudo whoami
Darren DeHaven
fonte
Esta não é uma resposta para a pergunta original. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem - você sempre pode comentar em suas próprias postagens e, quando tiver reputação suficiente , poderá comentar em qualquer post .
DavidPostill
@ Darren DeHaven: Você poderia explicar como isso se tornou a resposta para a pergunta feita aqui?
Renju Chandran chingath
4

Você também pode fazer isso:

sudo -S <<< "password" command
Jahid
fonte
somente este funciona para mim no Mac OS.
Mehdico 19/09
2

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

Exemplo:
1) Crie um arquivo:

gedit ~/.easy.install  

2) Cole isso e salve:

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

3) Torne executável:

sudo chmod +x ~/.easy.install  

4) Altere as permissões do arquivo para que somente o root possa lê-lo e editá-lo:

sudo chmod 700 ~/.easy.install  

5) Execute:

~/.easy.install  

Apreciar ;-)

desgua
fonte
O eco <senha> ainda aparecerá na lista de processos e se alguém tiver sorte com o ps aux no exato momento certo, poderá ver a senha em texto não criptografado. Melhor salvar a senha em um arquivo e usar <para redirecionar do arquivo para o sudo.
bobpaul
1

Configurar o sudo dessa forma é perigoso se alguém perceber que o sudo não requer senha na sua conta. A menos que você saiba o que está fazendo, não faça isso. Já tive isso no meu programa local de treinamento A + com o 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á executando com privilégios de superusuário.

Tempo.
fonte
0

Pessoalmente, faço o mesmo que John T respondeu em 9 de novembro de 2009 às 2:47. Também melhorei o meu de acordo com a orientação da resposta dele, obrigado.

A 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, eu posso facilmente usar a minha variável em vez do sudo,

$AutoSuDo apt-get update;

Isso é bastante útil em alguns scripts mais longos. Uso-os principalmente para computadores pessoais de outras pessoas, que tenho que manter.

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

  • resposta resposta em Apr 19 '11 às 23:56
  • user224306 comenta em 14 de maio '13 às 17:38 para John T responde em 9/11/09 às 2:47
Janar
fonte
0

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

echo -e 'password\npassword\n' | sudo passwd root
Jerson Martínez
fonte
O que a bandeira -e faz, @jerson Martinez?
user674669 25/04
11
O sinalizador -e para eco permite interpretar certas seqüências como tendo significados especiais.
Jerson Martínez