Como posso saber se tenho permissão para executar um comando específico?

18

Existe alguma maneira de identificar se eu, como usuário comum, tem o direito de emitir um comando.

Por exemplo; Quero verificar se tenho o direito de emitir o comando shutdown antes de realmente emiti-lo.

Algo como os seguintes comandos

-> doIhaveRightToIssue shutdown
-> Yes/No
Bernhard Colby
fonte
4
O caminho direto é tentar (sem sudo) e descobrir. Os comandos do modo de texto podem precisar sudoe os comandos gráficos podem precisar gksudo. Você também pode verificar onde o comando está instalado which command. Se em /sbinou /usr/sbin- você pode esperar que o comando precise sudoou gksudo.
sudodus 21/03

Respostas:

26

O caso mais simples é o de um executável binário como gzip. Primeiro, localizamos o executável:

$ which gzip
/bin/gzip

Então, olhamos para os atributos deste arquivo:

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 98240 oct 27  2014 /bin/gzip

Os três x nos dizem que o arquivo pode ser executado pelo proprietário (o primeiro root) ou por qualquer pessoa do grupo root(segundo root) e por qualquer outra pessoa, respectivamente. Portanto, seu usuário pode executar o programa.

No entanto, seu executável pode ser um arquivo de script que chama outros executáveis ​​dentro. Você pode executar o script, mas não os programas chamados dentro dele. Não há como determinar se o usuário tem permissão para fazer isso, a não ser realmente tentar.

Existem casos especiais como shutdown- este é realmente um link simbólico para um utilitário principal chamado systemctl, que possui seus próprios mecanismos para determinar se você pode chamá-lo e solicitar sua senha do sudo, se não o fizer, por exemplo .

(Sobre o whichcomando: localiza os executáveis ​​no seu $ PATH que você tem permissão para executar e informa qual deles você usa se tiver mais de um com o mesmo nome no $ PATH. Ele não localiza apenas nenhum executável. I use-o aqui como um exemplo de onde procurar a permissão. O fato de whichencontrar o executável já indica que você tem permissão para executá-lo.

Jos
fonte
Resposta muito concisa (+1). Por exemplo, é possível simular o resultado do apt-get install com o sinalizador -s (sudo apt-get install -s htop). Eu pensei que se não há como aprender a permissão de um comando antes de um problema, há pelo menos algo como "simular".
Bernhard Colby
Certamente, existem utilitários que fornecem um sinalizador "executar a seco" ou "simular" que você pode usar.
21717 Jos
4
whichO comando deve ser suficiente para os arquivos que residem em um dos diretórios adicionados à $PATHvariável Por exemplo, fazer sudo chmod 700 /bin/nanoou sudo chmod 744 nanofaz whichcom que não produza saída. Para scripts locais, que residem em algum lugar que não seja um dos PATHdiretórios, ls -lou as statchamadas serão suficientes. Boa resposta, mas adicione essas informações à sua publicação #
Sergiy Kolodyazhnyy 22/03
Saindo do que Serg disse, use algo como stat -c '%a' /bin/gzippara obter, 755por exemplo.
AT
21

Com sudo:

$ sudo -l shutdown
/sbin/shutdown

Se eu não tiver permissão, sudoreclamarei em vez de mostrar o comando.

Com o polkit, você verifica a ação que deseja executar:

$ pkcheck --action-id org.freedesktop.login1.power-off --process $$ -u --enable-internal-agent && echo yes
polkit\56temporary_authorization_id=tmpauthz1
yes

Encontrar a ação relevante é uma questão diferente.

muru
fonte
O problema com o sudo é que eu não sou sudoer no sistema. Por isso, tento tomar cuidado antes de realmente emitir um comando.
Bernhard Colby
4
@BernhardColby, você pode executar com segurança, sudo -lmesmo que não seja um sudoer - esse é o objetivo -l- para dizer se você pode executar um comando com o sudo.
Muru
Obrigado (+1), eu não sabia disso. Vou tentar a sua solução assim que tiver o meu pc.
Bernhard Colby
8

Você pode usar:

test -x $(command -v shutdown) && echo yes || echo no

command -v shutdownretorna o caminho para o shutdowncomando. test -xverifica se esse caminho é executável para você.

Observe que, embora você possa executar o comando, ele ainda pode falhar, porque possui permissão inadequada para executar a tarefa. Este é o caso comum em sistemas do tipo Unix, que, em vez de restringir o acesso para executar um comando, restringem o acesso às operações que os programas podem realmente executar.

Robie Basak
fonte
E por exemplo alias shutdown="shutdown now"?
Dmitry Grigoryev
Para evitar o problema de alias, pode-se usar $(which shutdown)ou $(shopt -u expand_aliases && command -v shutdown). Esse problema aparece apenas no modo interativo.
David Foerster
5

Bem, às vezes pode ser um pouco difícil ...

Primeiro de tudo, observe as permissões com ls -l...

 Comando owngrpotr user group
-rwxr-xr-x raiz bin vim

Se o último / terceiro trigêmeo tiver um x ("pode ​​executar") nele, outros - e isso significa que você - poderá executá-lo ... Se for um shell-script ou algo parecido, outros precisarão de r (" pode ler ") também.

Se outros não obtiverem permissão de execução, mas o grupo (o segundo trigêmeo) tiver, você poderá executá-lo se for um membro do grupo - no exemplo acima, bin . Por exemplo, o grupo de roda costuma ser usado para limitar quem pode executar su, portanto, somente usuários pertencentes a esse grupo podem executá-lo. Outro exemplo é criar um grupo para desenvolvedores e restringir a execução do compilador C e essas ferramentas a esse grupo.

Se houver um + após o último trigêmeo, isso significa que AccessControllLists são usadas - isso pode adicionar direitos de execução a usuários e grupos adicionais.

+++

Mesmo se você puder executar o comando, o comando poderá depender do acesso a arquivos, diretórios e / ou dispositivos aos quais você não tem acesso - isso pode limitar o que você poderá fazer (talvez não seja possível para fazer qualquer coisa).

Finalmente, embora você possa executar um comando, o próprio comando pode verificar sua identidade e se recusar a deixá-lo usá-lo, a menos que você esteja listado em um arquivo de configuração ou tenha certos usuários (por exemplo, root ). Por exemplo, o mountcomando permitirá apenas que o root monte qualquer dispositivo - usuários normais só podem montar dispositivos listados como tal em / etc / fstab ... que podem ser nenhum. Se você não é root e tenta montar algo, mountirá reclamar e se recusar a montar o dispositivo. Outro exemplo é o sudoque será executado para qualquer pessoa, mas somente usuários listados em / etc / sudoers poderão executar coisas como root .

Baard Kopperud
fonte
3

Usando which, type, commandetc. é uma solução prática que irá funcionar em 99% dos casos, mas para ser 100% de certeza que você terá que inspecionar manualmente cada diretório executável listado no seu $PATH. Muitos shells (inclusive bash) irão prefixar seu comando com entradas de $PATHe tentar executar esses arquivos repetidamente até que sejam bem-sucedidos. Como whichnão é possível executar o comando, é impossível prever qual arquivo seu shell realmente escolherá.

Por exemplo, imagine que eu tenho PATH=/opt/arm/bin:/bin, os dois diretórios que contêm arquivos executáveis, mas para arquiteturas diferentes. A execução which ddretornará /opt/arm/bin/dd(supondo que eu tenha permissões para executá-la), pois essa entrada é a primeira. No entanto, quando eu corro ddno meu shell, /bin/ddserá executado, porque /opt/arm/bin/ddfalhará na execução. A mesma situação pode acontecer no caso de binários corrompidos, falta de bibliotecas etc. No final, não há como saber se você será capaz de executar um comando ou não, além de tentar.

Outro aspecto é o que você considera "ter permissões". Como usuário, tenho permissões para executar, rm ~/filemas não rm /root/file. Novamente, não há uma maneira geral de saber isso sem inspeção manual ou emitir o comando e observar os resultados.

Dmitry Grigoryev
fonte