Uma regra básica para saber quais comandos são violados no sudo?

2

Existem alguns comandos como cd ou ll que, se eu os executar como sudo , a execução deles será apenas "quebra".

O que é uma regra para saber quais comandos vão "quebrar" dessa maneira quando um comando sudo os precede?

Esses dados podem ajudar eu e outros recém-chegados a codificar scripts mais estáveis.

    
por JohnDoea 27.03.2017 / 16:01

3 respostas

4

Apenas comandos externos podem ser executados por sudo .

Sudo

O programa sudo bifurca (inicia) um novo processo para iniciar um comando externo com os privilégios efetivos do superusuário (ou outro usuário, se a opção -u for usada). Isso significa que nenhum comando interno ao shell pode ser especificado; isso inclui palavras-chave, builtins, aliases e funções de shell.

A melhor maneira de descobrir se um comando está disponível como um comando externo (e não interno ao shell) é executar type -a command_name , que exibe todos os locais que contêm o executável especificado.

Exemplo 1: Shell embutido

Nesse caso, o comando cd só está disponível como um shell embutido:

$ type -a cd
cd is a shell builtin

Ele falha quando você tenta executá-lo com sudo :

$ sudo cd /
sudo: cd: command not found

Exemplo 2: alias

Nesse caso, o comando ls é externo, mas um alias com o mesmo nome também foi criado no shell do usuário.

$ type -a ls
ls is aliased to 'ls -F --color'
ls is /bin/ls

Se eu fosse executar sudo ls , não seria o alias que é executado como o superusuário; se eu quisesse a opção -F , ela teria que ser explicitamente incluída como uma opção, por exemplo, sudo ls -F .

Exemplo 3: Comando interno e externo da shell

Nesse caso, o comando pwd é fornecido como um shell interno e um comando externo:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

Nesse caso, o comando /bin/pwd externo seria executado com sudo :

$ sudo pwd
/home/anthony

Outros exemplos de comandos que são geralmente fornecidos como comandos internos e externos do shell são kill , test ( [ ) e echo .

Executa comandos internos do shell com o sudo

Se você realmente deseja executar um shell integrado com privilégios de superusuário, é necessário ativar um shell como o comando externo. Por exemplo, o comando a seguir executa bash como o superusuário com o comando cd builtin fornecido como uma opção de linha de comando:

$ sudo bash -c "cd /; ls"
bin   etc   lib  media  mnt  ntp.peers  proc  sbin     share  sys
tmp  var boot  dev  home  lost+found  misc   net  opt … …

Nota: Os aliases não podem ser passados como comandos para o Bash usando sua opção -c .

Redirecionamento da shell

Outro problema a ser observado é que o redirecionamento do shell ocorre no contexto do shell atual. Se eu tentar executar sudo /bin/echo abc > /test.file , não funcionará. Eu recebo -bash: /test.file: Permission denied . Enquanto o comando echo é executado com privilégios de superusuário, ele imprime sua saída para meu shell atual (não privilegiado) e, como usuário comum, não tenho permissão para gravar no diretório / .

Uma alternativa para isso é usar sudo para iniciar um novo shell (semelhante ao exemplo acima):

sudo bash -c "echo abc > /test.file"

Nesse caso, o redirecionamento do orptut ocorre no contexto do shell privilegiado (que tem permissão para gravar em / ).

Outra solução é executar o comando tee como o superusuário:

echo abc | sudo tee /test.file
    
por 27.03.2017 / 17:55
0

cd ou ll não é um programa, mas na verdade é um comando interno no shell. Você pode visualizar todos os comandos internos disponíveis usando o seguinte comando.

compgen -b

sudo não funcionará com todos esses comandos.

    
por 27.03.2017 / 16:12
0

ll não funciona com o sudo porque é um alias. Os aliases não funcionam com o sudo, já que você não obtém um shell interativo com o sudo (a menos que seja solicitado especificamente)

cd é um caso diferente, já que não faz sentido mudar para um diretório que você não tem permissão com o sudo.

Como sugerido, muitos recursos internos não funcionarão com o sudo, mas outros, principalmente kill . Você precisa executar sudo kill <pid> para eliminar um processo iniciado por um usuário diferente do seu.

    
por 27.03.2017 / 16:53