Eu tenho um programa que deve se comportar de maneira diferente se estiver sendo executado no "sudo". Existe uma maneira de descobrir se foi executado no sudo?
Atualização: Alguém perguntou por que eu gostaria de fazer isso. Nesse caso, em um Mac usando MacPorts, existe uma saída que solicita que você copie e cole 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 :-)
Respostas:
Sim, existem 4 variáveis de ambiente definidas quando um programa está sendo executado no sudo:
Observe que eles podem ser falsificados simplesmente configurando-os. Não confie neles para nada crítico.
Por exemplo: Neste programa, precisamos dizer ao usuário para executar outro programa. Se o atual foi executado com sudo, o outro também será.
Observe que ele só testa uma variável SUDO_ * se puder primeiro provar que está executando como root. Mesmo assim, ele o usa apenas para alterar algum texto útil.
fonte
Isso não responde diretamente à pergunta, mas acho que a pergunta correta não está sendo feita aqui. Parece-me que o solicitante quer um programa que atue de forma diferente se tiver certas permissões ou não, no entanto, eu diria que verificar se o sudo não é a maneira de fazer isso. Em primeiro lugar, muitos sistemas podem não implementar um "sudo", não é de forma alguma necessário no Linux ou em muitos Unixes.
Por exemplo, um usuário já pode estar logado como root, tornando o sudo sem sentido ou talvez o sistema tenha usuários não root que ainda tenham recursos para executar a tarefa administrativa que o programa deseja executar. Finalmente, talvez o sistema não possua root ou sudo e, em vez disso, use um sistema de controle de acesso obrigatório com recursos diferentes e sem capturar todos os superusuários nos quais o sudo se encontra. Ou o usuário pode ser sudoed, mas em uma conta que tenha permissões sem a sua própria conta por motivos de segurança (eu geralmente corro código não confiável com um usuário temporário sem privilégios, que só pode gravar em ramdisks para descartar, não aumentar minhas permissões ) No geral, é uma má idéia assumir um modelo de permissões específico, como sudo ou a existência de raiz, ou assumir que um usuário sudoed possui privilégios específicos.
Se você deseja descobrir se possui permissões para executar uma operação, a melhor maneira é tentar e fazê-lo. Verifique errno quanto a problemas de permissão, se falhar ou se for uma operação em vários estágios, que deve falhar ou ter êxito. você pode verificar se uma operação funcionará com funções como a função de acesso POSIX (cuidado com as possíveis condições de corrida aqui se as permissões estiverem sendo alteradas ativamente)
Se você precisar conhecer o usuário real por trás do sudo, além disso, poderá usar a função getlogin , que deve funcionar em qualquer sessão interativa com um terminal subjacente e permitir, por exemplo, descobrir quem está 'realmente' executando o comando para auditoria ou encontrar o diretório inicial do usuário real para salvar logs.
Finalmente, se o que você realmente deseja é descobrir se um usuário tem acesso root (ainda é uma má idéia, mas menos específica de implementação), você pode usar o getuid para verificar se há um uid 0 e, portanto, root.
fonte
Existem dois mecanismos que podem ser usados.
growisofs
não gosta de rodar em SUDO, então desmarco as variáveis SUDO nos scripts em que as uso. Pode ser falsificado de outra maneira. (A variável SUDO também é transportada para o ambiente para scripts executados sob os comandos at e batch.)É mais comum verificar se você está executando como o usuário apropriado. O
id
comando pode ser usado para fazer isso. O script do TomOnTime usa oid
comando para determinar sesudo
pode ser necessário executar o próximo comando.fonte
sudo
binário para outra coisa? Ou cite outro executávelsudo
para fingir o contrário? Não que eu realmente esperar que alguém em sã consciência fazer isso ...root
acessar para renomear osudo
executável. Um usuário normal não seria capaz de fazer isso. Eu notei que você pode fingir que está sendo executadosudo
. Renomear um programa existente funcionaria. O código necessário para umsudo
programa falso dedicado é trivial.Você pode comparar o ID do usuário efetivo versus o real.
Isso não significa estritamente que está sendo executado desfazer o sudo (também pode ser configurado), 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. Em seguida, você pode usá-lo para fornecer um aviso sobre isso).
fonte
sudo
define o ID efetivo e o real. Ao contrário de suid, o que não acontece. Aqui está um programa C trivial que você pode usar para testar (desculpe, o comentário removerá as novas linhas, você precisará adicioná-las novamente):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
perl -E 'say $<, "\n", $>'
Você pode verificar a variável UID (EUID) efetiva, da seguinte maneira:
fonte
sudo echo $USER
imprime o nome de usuário não privilegiado (a variável é substituída ANTES do sudo). Acabei usando seu código no meu script. Obrigado!Você pode tocar em um arquivo
/root
e depoisif -e
nele. E se -e for verdadeirorm
(verificando o código de erro) para que seu teste funcione na próxima vez.A verificação do código de erro (ou código de retorno) após a rm impede que alguém use com facilidade os poderes do sudo para criar o arquivo para fazer uma brincadeira com você.
fonte
/root
(o que não é necessariamente o mesmo que o UID 0), mas não verifica se obteve essas permissões usandosudo
.Descobri que isso funciona bem para isso
fonte