Como eu executo um comando sudo precisando de entrada de senha em segundo plano?

28

Eu desativei recentemente a % capacidade de cache de autenticação do sudo para que agora me peça uma senha toda vez .

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

sudo <command> &

No passado eu teria executado um comando sudo antes disso, ele teria armazenado em cache minha senha e me permitiria executar sudo comandos sem prompt durante os próximos minutos e, assim, permitiria que eu executasse o comando comando.
Mas quando eu o executo agora, como não há cache antes da mão e como ele inicia um novo thread imediatamente e sudo nem sequer me pede uma senha, eu não consigo executá-lo dessa maneira.

Portanto, a menos que eu execute sudo -i antes, não poderei executar um comando nesse formato, o que está se tornando bastante irritante.
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 quero executar desta forma é etherape se isso fizer alguma diferença, mas eu realmente gostaria que a solução funcionasse para todos os programas e comandos. / p>     

por Great Uncle Bulgaria 26.03.2016 / 15:27

3 respostas

53

Em vez de executar sudo em segundo plano, informe sudo para 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 apenas usar 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 sudo para o segundo plano:

-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 do Askpass são normalmente usados para o SSH. Uma delas é fornecida pelo pacote ssh-askpass-gnome , que é instalado por padrão, pelo menos no Ubuntu 15.10.

SUDO_ASKPASS=/usr/bin/ssh-askpass sudo -A sleep 10 &
    
por muru 26.03.2016 / 15:33
10

Se você estiver disposto a definir timestamp_timeout para pelo menos algo como 0.02 (1,2 segundo, eu diria que é tão seguro quanto 0 ) em /etc/sudoers (necessário no seu caso, mas com o configurações padrão ou com timestamp_timeout definido para qualquer coisa, mas 0 pode-se apenas fazer o seguinte), você poderia definir um alias como este em ~/.bashrc , o que não exigirá que você se lembre de fazer algo antes de executar o comando e que lhe permitirá manter 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 -v primeiro e separadamente, autenticando o usuário e limite a possível parte do plano de fundo ao comando [ $? ] && sudo , que verificará se sudo -v foi bem-sucedido e executado sudo de novo (possivelmente usando o 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 &
    
por kos 26.03.2016 / 16:02
8

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

A única maneira de contornar isso é trazer o comando de volta para o 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, tecle Enter e então pressione Ctrl Z para enviá-la de volta ao background e bg para informar para continuar correndo.

Uma abordagem mais simples seria nunca usar & e, em vez disso, enviar trabalhos para o plano de fundo manualmente com Ctrl Z e bg após iniciá-los. / p>

Finalmente, você pode querer considerar a configuração do tempo limite da senha do sudo para algo como 1 ou 2 segundos. Isso ainda lhe dará segurança suficiente (a menos que você esteja tentando se proteger contra o Flash) e permitir que você execute comandos como o esperado.

    
por terdon 26.03.2016 / 15:35