sudo testando credenciais

6

Eu tenho um script de trabalho que pode ser executado de 0 a 8-9 minutos. Ele requer sudo se encontrar um problema e precisa alterar permissões / propriedade em um arquivo. Eu não quero esperar pelo prompt sudo , pois isso pode levar alguns minutos para a execução, então eu faço sudo -v no início do script.

Se eu esperar que o roteiro demore muito, eu geralmente ando até o refeitório. Então, há algum tempo, incluí um manipulador de armadilhas, que chama uma função, que sudo -k solta minhas credenciais. Desta forma, pressionar Ctrl + C não deixa alguém com acesso a sudo enquanto ainda não estou de volta. Eu também chamo essa função no final do script, caso o script termine antes de voltar.

Se eu já fiz o comando sudo antes de chamar o script, sudo -v , ele não me pede minhas credenciais. Isso é bom.
Dependendo de onde eu comece, eu sei que o roteiro não vai demorar muito, e eu espero que termine. Se eu iniciei depois de ter acabado de fazer um comando sudo , sempre que acabar sem sudo credentials depois de terminar.

Eu verifiquei o valor de retorno de sudo -v . Na saída 0, isso não me diz se as credenciais já estavam lá (antes de executar o script) ou se a senha foi digitada corretamente antes. Isso não me ajuda a saber se devo executar sudo -k no final ou não.

Eu pensei em criar duas versões do script, uma com e outra sem sudo -v / sudo -k , mas não acho que seja uma boa solução e estou certo de selecionar a versão errada às vezes.

Existe uma maneira melhor de resolver isso? Estou faltando alguma coisa?

    
por user249135 17.02.2014 / 12:29

1 resposta

8

Você pode usar sudo -nv 2> /dev/null para obter um valor de saída de 0 quando as credenciais estiverem lá, sem ser solicitada a senha.

Eu tenho algo parecido para executar fdisk e eliminar as credenciais se não estivesse lá para começar. Combinado com a captura Ctrl + C , você obteria algo como (eu não sou um bom programador bash!):

#! /bin/bash
# this only removes credentials if logging in at the start was necessary

reset_sudo()
{
if [ $SUDOCREDCACHED != 0 ] ; then 
  # drop credentials if acquired in script
  sudo -k
fi
}

Ctrl_C()
{
  reset_sudo
  exit 0
}

sudo -nv 2> /dev/null
SUDOCREDCACHED=$?
if [ $SUDOCREDCACHED != 0 ] ; then 
  # acquire credentials
  sudo -v 
  if [ $? != 0 ] ; then 
    exit 1
  fi
fi

trap Ctrl_C SIGINT
### your stuff here ###
reset_sudo
    
por 17.02.2014 / 12:32