Um programa pode dizer que está sendo executado sob o sudo?

27

Eu tenho um programa que deve se comportar de maneira diferente se estiver sendo executado em "sudo". Existe uma maneira de descobrir se foi executado sob o sudo?

Atualização: Alguém perguntou por que eu desejaria fazer isso. Nesse caso, em um Mac usando o MacPorts, há uma saída que diz para você recortar e colar um comando específico. Se o comando MacPorts foi executado com "sudo", ele deve incluir sudo no comando de amostra:

$ sudo port selfupdate 
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead.  It would be even better if it just did it for you :-)
    
por TomOnTime 20.01.2014 / 23:12

7 respostas

46

Sim, existem 4 variáveis de ambiente definidas quando um programa está sendo executado sob o sudo:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

Note que estes podem ser falsificados simplesmente configurando-os. Não confie neles para qualquer coisa crítica.

Por exemplo: Neste programa, precisamos dizer ao usuário para executar outro programa. Se o atual foi executado com o sudo, o outro será também.

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

Observe que ele testa somente uma variável SUDO_ * se puder provar primeiro que está sendo executado como root. Mesmo assim, ele usa apenas para alterar algum texto útil.

    
por 20.01.2014 / 23:12
11

Isso não responde diretamente à questão, mas não creio que a pergunta certa esteja sendo feita aqui. Parece-me que o consulente quer um programa que irá agir de forma presumível se tiver certas permissões ou não, mas eu diria que procurar por sudo não é a maneira de fazer isso. Em primeiro lugar muitos sistemas não podem implementar um "sudo", não é necessário em Linux ou muitos Unixes.

Por exemplo, um usuário pode estar logado como root já, tornando o sudo absurdo ou talvez o sistema tenha usuários não-root que ainda tenham recursos para executar a tarefa administrativa que o programa pode desejar fazer. Finalmente, talvez o sistema não tenha raiz ou sudo e, em vez disso, use um sistema de controle de acesso obrigatório com recursos diferentes e não capture todo o superusuário para o sudo. Ou o usuário pode ser sudoed, mas em uma conta que tenha menos permissões do que sua própria conta por motivos de segurança (geralmente executo código não confiável com um usuário temporário sem privilégios que só pode gravar em ramdisks para eliminar, não aumentar minhas permissões ). Em geral, é uma má idéia assumir um modelo de permissões específico como sudo ou a existência de root ou assumir que um usuário sudo tem algum privilégio em particular.

Se você quiser descobrir se tem permissões para realizar uma operação, a melhor maneira é simplesmente tentar fazê-lo e, em seguida, verificar errno para problemas de permissão se ele falhar ou se for uma operação em vários estágios que deve falhar ou todos são bem-sucedidos, você pode verificar se uma operação funcionará com funções como o POSIX acessar (cuidado) de possíveis condições de corrida aqui se as permissões estão sendo ativamente alteradas)

Se, além disso, você precisar conhecer o usuário real por trás do sudo, use getlogin função que deve funcionar para qualquer sessão interativa com um terminal subjacente e permitiria, por exemplo, descobrir quem está 'realmente' executando o comando para auditar ou encontrar o diretório home do usuário real para salvar logs.

Finalmente, se o que você realmente quer é descobrir se um usuário tem acesso root (ainda é uma má ideia, mas menos implementação específica), você pode usar getuid para verificar se há um fluxo de 0 e, assim, raiz.

    
por 21.01.2014 / 11:57
7

Existem dois mecanismos que podem ser usados.

  • A verificação das variáveis de ambiente pode ser falsificada de qualquer forma, mas é a mais fácil de ser feita. growisofs não gosta de rodar sob o SUDO, então eu descompactei as variáveis SUDO nos scripts onde eu as utilizo. Pode ser fingido de outra maneira. (A variável SUDO também é transportada para o ambiente para scripts executados sob os comandos at e batch).
  • Outra maneira de ver se você está executando sob o sudo é percorrer a lista de processos do seu processo pai procurando pelo sudo. Seria difícil esconder que você estava usando o sudo dessa maneira, mas é mais complexo. Ainda é possível fingir que você está executando sob o sudo.

É mais comum verificar se você está executando como o usuário apropriado. O comando id pode ser usado para fazer isso. O script do TomOnTime usa o comando id para determinar se sudo pode ser necessário para executar o próximo comando.

    
por 21.01.2014 / 02:54
2

Você pode comparar o ID do usuário efetivo com o real.

Isso não significa estritamente que esteja executando o comando undo sudo (pode ser setuid'd também), mas indica que o programa tem mais direitos do que o usuário pode esperar. (por exemplo, em um programa que é normalmente executado sem esses direitos, mas precisa ser executado com eles durante a instalação ou para instalar atualizações. Então, você pode usar isso para dar algum feedback de aviso sobre isso).

    
por 21.01.2014 / 12:47
2

Você pode verificar a variável UID efetiva (EUID) da seguinte forma:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi
    
por 20.05.2015 / 11:28
-1

Você pode tocar em um arquivo em /root e, em seguida, em if -e . E se -e for verdadeiro, rm (verificando o código de erro), então o seu teste funciona da próxima vez.

Verificando o código de erro (ou código de retorno) após o rm impede alguém de usar o sudo power para criar o arquivo para jogar uma brincadeira com você.

    
por 21.01.2014 / 07:36
-2

Descobri que isso funciona bem para isso

[ $(cat /proc/$PPID/loginuid) -ne 0 ] && [ "$USER" == "root" ]
    
por 01.10.2015 / 17:47