Questão sudo com senha em uma linha de comando?


Nos dias corridos, eu 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 executar o sudo com senha em uma linha de comando, ou há algum outro método para fazer isso?


84


origem


Você precisa halt para executar como root. - Keith Thompson
Não faz sudo tem um tempo limite de 15 minutos? Você não poderia correr, digamos sudo ls ou algo semelhante, digite sua senha e execute o comando acima, tendo sudo privilégios ainda ativos? (Eu não posso testar isso no momento, senão eu colocaria isso como uma resposta.) - Matt
O tempo limite em sudo é configurável. Pessoas conscientes da segurança (paranóicas, como eu) definem para zero ... :-) - dda
Veja também Solicitar senha sudo e elevar programaticamente o privilégio no script bash?, Como inserir a senha apenas uma vez em um script bash que precisa de sudo, Solicitar privilégio de root a partir de um script, Crie um usuário sudo em script sem prompt de senha ..., Como solicitar ao usuário a senha do sudo?etc - jww


Respostas:


Sim, use o -S interruptor 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> com sua senha.


121



Obviamente, não se desejaria executar isto se houvesse algum 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, obrigado. - nelaaro
Se você decidiu usar o 'echo <senha> | opção sudo -S ', ​​para evitar expor a senha no histórico de comandos, inicie o comando com um caractere SPACE. Naturalmente, a melhor opção é canalizar a senha de um arquivo seguro. - user224306
Você pode querer usar isso se você tiver a senha em um $ VARIABLE (que você poderia ter disposição com o sops por exemplo) - Natim


Você também pode configurar o sudo com visudo para 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

9





Você poderia substituir sua linha de comando com isso:

$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.


8



uma versão alternativa (e provavelmente preferida) disso: sudo sh -c "./configure && make && make install && halt" - quack quixote
Mas, então, nem todos os arquivos de compilação gerados teriam as permissões de superusuário? Isso impediria que você executasse ./configure && como usuário regular posteriormente. - user45909
Sim, user45909, você está certo. Eu pessoalmente nunca executei novamente ./configure && make exceto depois de baixar uma atualização do pacote principal de qualquer maneira, mas eu provavelmente não sou típico. - CarlF


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

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 $USER para ser expandido pelo shell (não raiz).

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


8





Definir HISTIGNORE para "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 com segurança sua senha para o comando sudo, sem mantendo um histórico de 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 "export HISTIGNORE ="sudo -S'"no seu arquivo ~ / .bashrc, então carregue com". ~ / .bashrc "ou logoff, em seguida, 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. Definindo" 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 precise 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ê rodasse "sudo -S" sem "-k" e o cache de autenticação sudo já tivesse suas credenciais (e ainda fosse válido, o cache de autenticação sudo padrão fosse 5 minutos) então o bash executaria sua senha como um comando, que é mau.


5



Assim como uma pequena nota 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


Se você quiser ter mais cuidado, você poderia fazer um script, alterar as permissões do arquivo para que somente o root possa ler e editar e depois 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) Corra:

~/.easy.install  

Apreciar ;-)


2



O echo <password> ainda aparecerá na lista de processos e, se alguém tiver sorte com o ps aux no momento exato, ele 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


Você também pode fazer isso:

sudo -S <<< "password" command

2





Configurar o sudo assim é perigoso se alguém tiver visto o fato de 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.


1