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