Como definir o tempo limite para sudo pedindo senha?

5

Por exemplo, se eu executar sudo apt-get install vlc , ele me pedirá para inserir a senha sudo .

Se eu não inserir a senha para sudo it [sudo] password for avinash: permanecerá por muito tempo.

Como faço para definir este tempo de espera de senha sudo? Se esse tempo de espera expirar, ele mostra automaticamente time expires .Isso é possível?

Observação: não estou perguntando por quanto tempo sudo se lembra da senha ( RootSudoTimeout - Community Ubuntu Documentação ).

    
por Avinash Raj 07.01.2014 / 14:11

3 respostas

3

Isto não é diretamente possível a partir do próprio sudo, mas é possível com alguma técnica hackea.

sudo_timeout.sh :

#!/bin/bash

timeout=10 #seconds

set -m

echoerr() { echo "$@" 1>&2; }

keep_eye_on() {
    pid=$1
    time_passed=0
    while kill -0 $pid &> /dev/null; do
        sleep 1
        let time_passed=time_passed+1
        if [ $time_passed -ge $timeout ]; then
            echoerr "Timeout reached."
            kill -9 $pid
            exit 1
        fi
    done
}

if [ -z "$1" ]; then
    echoerr "Please specify a process to run!" 
    exit 1
fi;

sudo $@ &
pid=$!

keep_eye_on $pid &
while true; do
    if kill -0 $pid &> /dev/null; then
        fg sudo > /dev/null; [ $? == 1 ] && break;
    else
        break
    fi
done

A variável timeout mantém o tempo limite em segundos para aguardar antes de matar o processo sudo que está solicitando senha.

Uso:

./sudo_timeout.sh <command>

Exemplo:

./sudo_timeout.sh ls -al

Caso o tempo limite seja atingido, você verá:

alex@MaD-pc:~$ ./sudo_timeout.sh ls -al
[sudo] password for alex: Timeout reached.
./sudo_timeout.sh: line 34: 14583 Killed                  sudo $@

Caso você digite sua senha antes do tempo limite, o comando será executado normalmente.

Disclaimer: O acima é testado com comandos simples como ls e nano , com e sem argumentos, mas não posso garantir que funcionará em todos os casos, porque eu não testei completamente, é apenas algo Eu vim com.

    
por hytromo 07.01.2014 / 14:57
3

Não, isso não é possível. A entrada da senha em si não possui um temporizador. Ele esperará até você confirmar a entrada.

Se você quiser cancelar o comando em vez de digitar a senha, pressione Ctrl - C .

    
por Rinzwind 07.01.2014 / 14:21
2

Fácil usando o recurso SUDO_ASKPASS do sudo.

Crie este script sudo-askpass-timeout.sh em algum lugar:

#! /bin/bash -eu   ## dash doesn't support read -s

# "read" will not reset the terminal echo mode if it is canceled. Let's save/restore the tty status.
stty_orig='stty -g'
trap 'stty "$stty_orig"' EXIT

## Default timeout is 60 seconds.
if read -s -t ${READ_TIMEOUT:-60} -p "$*"
then
    echo "$REPLY"
else
    echo "Timeout" >&2
    exit 1
fi

Em seguida, crie algo como sudo-timeout.sh no mesmo diretório:

#! /bin/bash -eux

## Syntax:  sudo-timeout.sh [-t timeout_in_seconds] <sudo arguments>
## Example:  sudo-timeout.sh -t 60 apt-get update

export SUDO_ASKPASS="$(dirname "$0")/sudo-askpass-timeout.sh"
export READ_TIMEOUT=60
if [ $# -ge 3  ] && [ "$1" = "-t" ]
then
        shift
        READ_TIMEOUT=$1
        shift
fi
exec sudo -A "$@"

Exemplo:

sudo-timeout.sh apt-get update  ##Default: 60 second timeout
sudo-timeout.sh -t 30 apt-get update
    
por Raúl Salinas-Monteagudo 03.11.2015 / 17:54