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
command-line
permissions
Bernhard Colby
fonte
fonte
sudo
) e descobrir. Os comandos do modo de texto podem precisarsudo
e os comandos gráficos podem precisargksudo
. Você também pode verificar onde o comando está instaladowhich command
. Se em/sbin
ou/usr/sbin
- você pode esperar que o comando precisesudo
ougksudo
.Respostas:
O caso mais simples é o de um executável binário como
gzip
. Primeiro, localizamos o executável:Então, olhamos para os atributos deste arquivo:
Os três x nos dizem que o arquivo pode ser executado pelo proprietário (o primeiro
root
) ou por qualquer pessoa do gruporoot
(segundoroot
) 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 chamadosystemctl
, 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
which
comando: 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 dewhich
encontrar o executável já indica que você tem permissão para executá-lo.fonte
which
O comando deve ser suficiente para os arquivos que residem em um dos diretórios adicionados à$PATH
variável Por exemplo, fazersudo chmod 700 /bin/nano
ousudo chmod 744 nano
fazwhich
com que não produza saída. Para scripts locais, que residem em algum lugar que não seja um dosPATH
diretórios,ls -l
ou asstat
chamadas serão suficientes. Boa resposta, mas adicione essas informações à sua publicação #stat -c '%a' /bin/gzip
para obter,755
por exemplo.Com
sudo
:Se eu não tiver permissão,
sudo
reclamarei em vez de mostrar o comando.Com o polkit, você verifica a ação que deseja executar:
Encontrar a ação relevante é uma questão diferente.
fonte
sudo -l
mesmo que não seja um sudoer - esse é o objetivo-l
- para dizer se você pode executar um comando com o sudo.Você pode usar:
command -v shutdown
retorna o caminho para oshutdown
comando.test -x
verifica 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.
fonte
alias shutdown="shutdown now"
?$(which shutdown)
ou$(shopt -u expand_aliases && command -v shutdown)
. Esse problema aparece apenas no modo interativo.Bem, às vezes pode ser um pouco difícil ...
Primeiro de tudo, observe as permissões com
ls -l
...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
mount
comando 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,mount
irá reclamar e se recusar a montar o dispositivo. Outro exemplo é osudo
que será executado para qualquer pessoa, mas somente usuários listados em / etc / sudoers poderão executar coisas como root .fonte
Usando
which
,type
,command
etc. é 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 (inclusivebash
) irão prefixar seu comando com entradas de$PATH
e tentar executar esses arquivos repetidamente até que sejam bem-sucedidos. Comowhich
nã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çãowhich dd
retornará/opt/arm/bin/dd
(supondo que eu tenha permissões para executá-la), pois essa entrada é a primeira. No entanto, quando eu corrodd
no meu shell,/bin/dd
será executado, porque/opt/arm/bin/dd
falhará 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 ~/file
mas nãorm /root/file
. Novamente, não há uma maneira geral de saber isso sem inspeção manual ou emitir o comando e observar os resultados.fonte