Como executo um comando sudo que precisa de entrada de senha em segundo plano?

29

Recentemente, desabilitei sudoa capacidade de cache de autenticação, para que agora eu sempre solicite uma senha.

E, embora isso seja bom para segurança, causou um pequeno problema para o qual não consegui encontrar uma solução, não consigo executar comandos que seguem as seguintes linhas:

sudo <command> &

No passado, eu teria executado um sudocomando antes disso, ele teria armazenado em cache minha senha e me permitido executar sudocomandos sem aviso nos próximos minutos, e, portanto, permitiria executar o comando.
Mas quando eu o executo agora, já que não há armazenamento em cache antes e como ele inicia um novo thread imediatamente e sudonem sequer solicita uma senha, não consigo executá-lo dessa maneira.

Portanto, a menos que eu corra sudo -iantes, não consigo executar um comando nesse formato que está se tornando um pouco chato.
Então, eu queria saber se existe alguma maneira de contornar isso e ainda executar programas e comandos dessa maneira?

Estou executando o Ubuntu GNOME 15.10 com o GNOME 3.18 e, especificamente, o programa que desejo executar dessa maneira é etherapese isso faz alguma diferença, mas eu realmente gostaria que a solução funcionasse para todos os programas e comandos.

muru
fonte
3
@kossince &não é realmente pesquisável, estou mudando isso para … sudo command in the background.
Muru
@muru Se você pode fazer com que os mecanismos de pesquisa populares pesquisem caracteres especiais. : P
kos 26/03
1
@ kos você ficaria surpreso . : D
muru 26/03

Respostas:

56

Em vez de executar sudoem segundo plano, diga sudopara executar o comando em segundo plano. De man sudo:

-b, --background
     Run the given command in the background.  Note that it is not
     possible to use shell job control to manipulate background
     processes started by sudo.  Most interactive commands will
     fail to work properly in background mode.

Por exemplo:

sudo -b sleep 10

Outra maneira seria usar apenas um shell para executar o comando:

sudo sh -c 'sleep 10 &'

Outra opção seria especificar um programa gráfico para obter a senha e enviar sudopara o segundo plano de qualquer maneira:

-A, --askpass
     Normally, if sudo requires a password, it will read it from
     the user's terminal.  If the -A (askpass) option is
     specified, a (possibly graphical) helper program is executed
     to read the user's password and output the password to the
     standard output.  If the SUDO_ASKPASS environment variable is
     set, it specifies the path to the helper program.  Otherwise,
     if sudo.conf(5) contains a line specifying the askpass
     program, that value will be used.  For example:

         # Path to askpass helper program
         Path askpass /usr/X11R6/bin/ssh-askpass

     If no askpass program is available, sudo will exit with an
     error.

Os programas Askpass são normalmente usados ​​para SSH. Um deles é fornecido pelo ssh-askpass-gnomepacote, que é instalado por padrão, pelo menos no Ubuntu 15.10.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &
muru
fonte
11

Se você estiver disposto a definir timestamp_timeoutpelo menos algo como 0.02(1,2 segundos, eu diria tão seguro quanto 0) em /etc/sudoers(necessário no seu caso, mas com as configurações padrão ou com timestamp_timeoutqualquer coisa que 0não seja a seguinte) , você pode definir um alias como este ~/.bashrc, que não exigirá que você lembre de fazer algo antes de executar o comando e que permitirá que você mantenha o controle do processo .:

alias sudo='sudo -v; [ $? ] && sudo'

O truque aqui é o ponto-e-vírgula, que fará com que o Bash analise sudo -vprimeiro e separadamente, autenticando o usuário e limitando a parte potencial de segundo plano ao [ $? ] && sudocomando, que verificará se sudo -vfoi bem-sucedido e será executado sudonovamente (potencialmente em segundo plano), caso tenha sido.

$ alias sudo='sudo -v; [ $? ] && sudo'
$ sudo -H gedit &
[sudo] password for user:
[1] 19966
$ jobs
[1]+  Running                 [ $? ] && sudo -H gedit &
kos
fonte
Será que sudo -vestender o cache de credenciais mesmo se o cache está desativado? E, IIRC <para que os aliases se expandam, o espaço deve estar no final do comando, não no começo.
Muru
@muru Eu esqueci que ele se timestamp_timeoutdefiniu 0. E sim, eu estraguei completamente a coisa da expansão do alias, na verdade o alias não deveria se expandir. Obrigado.
kos
Não alias sudo='sudo -v && sudo'seria tão bom?
G-Man diz 'Reinstate Monica'
@ G-Man Não, isso funciona porque o ;Bash faz a análise sudo -vprimeiro e separadamente; usar o &&Bash analisaria ambos como um único comando e os dois em segundo plano imediatamente.
kos
8

Você não pode. O &comando envia o plano de fundo imediatamente. Ou seja, um subshell é criado em segundo plano e o comando é executado lá. Quando esse comando emite um prompt, como é o caso sudo, o prompt é exibido em segundo plano e você nunca o vê.

A única maneira de contornar isso é trazer o comando de volta ao primeiro plano, fornecer a senha e enviá-la de volta ao segundo plano. Por exemplo:

$ sudo command &
$ fg
sudo command
[sudo] password for terdon: 

Agora, digite sua senha, pressione Entere, em seguida, pressione CtrlZpara enviá-la de volta ao plano de fundo e bgdizer-lhe para continuar executando.

Uma abordagem mais simples seria nunca usar &e, em vez disso, enviar tarefas para o plano de fundo manualmente com CtrlZe bgapós iniciá-las.

Finalmente, considere definir o tempo limite da senha do sudo para algo como 1 ou 2 segundos. Isso ainda lhe daria segurança suficiente (a menos que você esteja tentando se proteger contra o Flash) e permitiria executar comandos como o esperado.

Terdon
fonte
O Flash está roubando meu bolo de chocolate, então ... ; P #
2
Nesta era de vulnerabilidades da Adobe e malware que infecta o firmware, é necessário ter cuidado com o Flash.
precisa saber é o seguinte
Em uma nota lateral, é realmente possível definir o tempo limite para segundos? man sudoersdiz timestamp_timeout's valor deve especificar minutos com uma possível parte fracionária (que por sinal faz sudoerro se eu tentar especificar um, não sei porquê).
kos
2
@kos parece que sim. 2.5funciona bem aqui (Arch, sudoversão 1.8.15).
terdon