AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 777552
Accepted
Jay Taylor
Jay Taylor
Asked: 2024-06-02 01:20:49 +0800 CST2024-06-02 01:20:49 +0800 CST 2024-06-02 01:20:49 +0800 CST

Verifique se o usuário atual pode executar o sudo sem exigir uma senha

  • 772

Quero verificar se o usuário atual que está executando um script de shell BASH tem acesso ao sudo sem senha ou não. Caso contrário, prefiro que o script seja encerrado em vez de solicitar uma senha.

linux
  • 2 2 respostas
  • 4328 Views

2 respostas

  • Voted
  1. Best Answer
    terdon
    2024-06-02T07:10:10+08:002024-06-02T07:10:10+08:00

    Se tudo o que você deseja verificar é se o usuário tem acesso sem senha sudo , basta executar sudo -n. De man sudo:

           -n, --non-interactive
                   Avoid prompting the user for input of any kind.   If  a
                   password  is required for the command to run, sudo will
                   display an error message and exit.
    
    

    Isso significa sudo -nque retornará apenas um erro, a menos que o usuário possa executar sudosem uma senha. O exemplo mais complexo foi SUDO_ASKPASSdeterminar se o usuário tinha permissão para executar sudo, a verificação de ausência de senha sudoé mais simples. Você pode simplesmente fazer algo como:

    if sudo -n true 2>/dev/null; then
      echo "user can run passwordless sudo" 
    else
      echo "user cannot run passwordless sudo" 
    fi
    

    Ou mesmo

    sudo -n true 2>/dev/null && 
      echo "user can run passwordless sudo" || 
        echo "user cannot run passwordless sudo" 
    

    Ou, em um script, se você quiser apenas sair:

    sudo -n true 2>/dev/null || exit 1
    

    Claro, isso apenas verifica se o usuário pode executar sudocomandos sem senha. Ele não faz distinção entre o caso de um usuário que já foi autenticado e está dentro do sudotempo limite, portanto não é solicitada uma senha e um usuário que recebeu o direito de executar todos os comandos sem uma senha geralmente. Presumo que este seja o comportamento desejado, já que nada em contrário foi mencionado na pergunta e a própria resposta do OP funciona da mesma maneira. Se você deseja apenas verificar o passwordless completo sudo, basta executar um sudo -kpara limpar as credenciais atuais de antemão:

    $ sudo -k; sudo -n true 2>/dev/null && 
      echo "user can run passwordless sudo" || 
        echo "user cannot run passwordless sudo" 
    

    Agora, como @Kamil Maciorowski mencionou nos comentários, isso falhará nos casos em que o usuário possa ter recebido sudoacesso sem senha /usr/bin/trueespecificamente. Para se proteger contra isso, você poderia fazer algo assim:

    ln -sf /usr/bin/true /tmp/ && sudo -n /tmp/true 2>/dev/null &&   
        echo "user can run passwordless sudo" ||     
          echo "user cannot run passwordless sudo" 
    rm /tmp/true
    

    Aqui, ao criar um link simbólico /tmp/trueque aponta para /usr/bin/true, isso funcionará mesmo se /usr/bin/trueestiver configurado para ser executado sem senha sudo. Agora, se estamos sendo paranóicos, é teoricamente possível que alguém também tenha configurado /tmp/truepara rodar com passwordless sudo. Para se proteger também contra esse cenário improvável, você poderia fazer:

    rand=$(mktemp /tmp/true.XXXXX); cp /usr/bin/true "$rand" &&
      sudo -n "$rand" 2>/dev/null &&   
        echo "user can run passwordless sudo" ||     
          echo "user cannot run passwordless sudo" 
    rm "$rand"
    

    Aqui, copiamos /usr/bin/true(que é um pequeno arquivo de 27K no meu sistema) para o /tmpdiretório com um nome aleatório (garantido que não existe) e então fazemos a verificação com isso. Embora ainda seja teoricamente possível que alguém tenha adicionado aleatoriamente essa string específica a sudoers, as chances de isso acontecer são tão pequenas que acho seguro ignorá-las.

    • 26
  2. Jay Taylor
    2024-06-02T01:27:00+08:002024-06-02T01:27:00+08:00

    Eu testei isso no BASH em algumas das principais distribuições Linux, como Debian, Redhat e Oracle Enterprise Linux 7. Esta técnica não funciona no FreeBSD ou em qualquer BSD (incluindo macOS).

    if SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; then
        echo 'Current user has access to passwordless sudo'
    else
        echo 'Current user DOES NOT have access to passwordless sudo'
    fi
    

    Isso aproveita a askpassopção de sudotentar usar outro programa para validar a senha. Ao defini-lo como /bin/false, uma das duas respostas padrão é retornada com base no fato de o usuário poder executar sudocomandos sem senha ou não.

    Casos de teste

    A matriz do caso de teste é a seguinte:

    Caso 1. Usuário com direitos sudo sem senha

    terd1@host $ SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; echo $?
    0
    

    Caso 2. Usuário com direitos sudo, mas exigindo uma senha

    terd2@host $ SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; echo $?
    1
    

    Caso 3. Um usuário sem direitos sudo

    terd3@host $ SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; echo $?
    1
    

    Se o código de retorno for 0, o usuário poderá executar sudocomandos sem senha, se for diferente de zero (por exemplo, 1), esse usuário não terá acesso.

    ps Obrigado a terdon por fornecer um ponto de partida para esta resposta: https://unix.stackexchange.com/a/692109/22709

    • 3

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve