Por que não 'sudo cd / var / named' funciona? [duplicado]

153

Eu quero cd em /var/named , mas isso me dá uma permissão negada erro, e quando eu quero usar sudo para fazer isso, não sou permitido. Qual é a razão técnica para isso, e é possível fazer isso de outra maneira?

    
por Hojat Taheri 06.05.2013 / 21:02

5 respostas

212

A razão pela qual você não pode fazer isso é simples e duas vezes

1

cd não é um programa, mas um comando embutido e sudo se aplica somente a programas.

sudo foo significa executar o programa foo como root

sudo cd /path retorna

sudo: cd: command not found

porque cd não é um programa.

2

Se fosse possível usar o sudo para cd em um diretório protegido, depois de executar o comando sudo cd /var/named , você estaria nesse diretório como um usuário normal, mas os usuários normais não podem estar nesse diretório.

Isso não é possível.

Solução alternativa:

Você pode usar sudo -i para se elevar ao superusuário. Por exemplo:

sudo -i
cd /var/named 

Agora você está logado como root e pode usar qualquer comando que desejar. Quando terminar, digite exit e você está de volta a estar logado como usuário normal.

    
por Warren Hill 06.05.2013 / 21:30
25

Isso porque cd não é um executável, é uma função do shell para alterar o diretório.

Se você executar:

type cd

você receberá:

% bl0ck_qu0te%

Você pode usar sudo -s para abrir um shell interativo e, em seguida, cd para o diretório desejado:

sudo -s
cd /var/named

Para retornar ao seu shell normal, simplesmente pressione Ctrl + D .

    
por Basharat Sialvi 06.05.2013 / 21:29
16

Vale lembrar também que, apesar do status de cd como um shell embutido ou binário externo, o sudo funciona gerando um novo processo para executar o comando especificado .

Por que isso é importante? Porque o fluxo básico de execução do sudo se torna algo muito parecido com isso:

  1. O shell gera um subprocesso para executar o sudo com os parâmetros fornecidos
  2. o sudo autentica o usuário e confirma seu direito de executar o comando especificado
  3. o sudo gera um subprocesso para executar o comando especificado
  4. o sudo aguarda o subprocesso gerado na etapa 3 para sair
  5. o sudo sai, retornando ao shell
  6. O subprocesso gerado na etapa 1 é encerrado, retornando o usuário para o prompt de shell

(Este pode ser tecnicamente ligeiramente incorreto; há uma chamada de sistema que realmente substitui o processo em execução por um novo (que é o ( execve() ) da biblioteca C. No entanto, para os propósitos desta explicação, os dois são equivalentes.)

Isso se torna importante quando você considera que o diretório de trabalho atual é uma propriedade de cada processo e é herdado, mas não promovido . Portanto, se o processo A gerar um novo processo B, então o processo B começa com o mesmo diretório de trabalho em que o processo A estava. (É por isso que algo tão mundano quanto ls ./ faz o que você espera.) seu diretório de trabalho, a menos que o processo A fique fora do caminho procurando por isso, A está completamente inconsciente dessa mudança. (Isso, por sua vez, é o porquê se você executar algo como find / e abortar até a metade, você não terminará em algum local aparentemente aleatório no sistema de arquivos apenas porque achei que estava olhando para lá no momento foi abortado.)

Portanto, mesmo que sudo cd /somewhere tenha feito exatamente o que diz na lata, quando sudo sair, você será levado de volta ao ponto de partida. Portanto, efetivamente, do ponto de vista do usuário, ele se torna um não operacional. O fato de que cd , enquanto estava em execução, chamou a função de biblioteca do sistema chdir() para definir um novo diretório de trabalho, não ajuda você, o usuário.

Como Warren Hill apontou, a solução correta (eu realmente não chamaria uma solução alternativa) é usar sudo -i , que o leva a um shell de root, onde você pode navegar livremente pelo sistema de arquivos e executar os comandos que quiser. Observe, no entanto, que quando você sair desse shell, você ainda é trazido de volta para onde começou na hierarquia de diretórios exatamente pelo mesmo motivo descrito acima.

    
por α CVn 07.05.2013 / 09:27
15

Todas as respostas acima estão corretas; aqui está uma solução embora

sudo sh -c "cd restricted-dir; some_command"
    
por Tagar 07.11.2015 / 07:00
3

Você também pode alterar a permissão temporariamente se for um usuário sudo.

sudo chmod 0775 caminho

ou

sudo chmod + r caminho da pasta

Certifique-se de colocá-lo de volta, se necessário.

    
por Andres Abello 07.11.2016 / 18:14