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


Esta questão já tem uma resposta aqui:

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


148
2018-05-06 19:02


origem




Respostas:


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 aplica-se apenas aos 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 sudo para cd para um diretório protegido, em seguida, ter executado 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 super usuário. Por exemplo:

sudo -i
cd /var/named 

Agora você está logado como root e pode usar os comandos que desejar. Quando terminar tipo exit e você está de volta a estar logado como um usuário normal.


207
2018-05-06 19:30



Tecnicamente cd é um comando interno e externo. unix.stackexchange.com/questions/50058/… - kojiro
@kojiro Ubuntu não; pelo menos em uma instalação limpa; ter /usr/bin/cd apenas o construído em - Warren Hill
Quanto ao ponto 2: Se você sudo -i (ou sudo su) então cd /var/named e depois su normaluser... você pode fazer aquilo? - Alvin Wong
@AlvinWong Por que não experimentá-lo e descobrir? Apenas testei se você sudo -i então cd para um diretório você não deve estar no su normal_user então pwd mostra que você está no diretório protegido, mas ls não funciona ls: cannot open directory.: permission denied - Warren Hill
Solução alternativa funcionou. - Nino Škopac


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

Se você executar:

type cd

você receberá:

cd é uma função shell

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

sudo -s
cd /var/named

Para voltar para sua concha normal, simplesmente pressione Ctrl+D.


25
2018-05-06 19:29





Vale lembrar também que, cdo status como um shell interno ou binário externo, não obstante, 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 semelhante a isto:

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

(Este pode estar tecnicamente ligeiramente incorreto; há uma chamada de sistema que, na verdade, substitui o processo de execução com um novo (que é o da biblioteca C execve()). No entanto, para os fins 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. Então, se o processo A gera 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ê esperaria.) Mas se o processo B mudar Está diretório de trabalho, a menos que o processo A saia fora do caminho procurando por isso, A não tem consciência dessa mudança. (Isso, por sua vez, é por que se você executar algo como find / e abortar a meio caminho, você não acaba em algum local aparentemente aleatório no sistema de arquivos apenas porque achei que estava olhando lá no momento em que foi abortado.

Então, mesmo se sudo cd /somewhere fez exatamente o que diz na lata, no momento sudo sai, você é trazido de volta onde você começou. 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 o chdir() função da biblioteca do sistema para definir um novo diretório de trabalho, não ajuda você, o usuário.

Como Warren Hill apontou, a solução adequada (Eu realmente não chamaria isso de uma solução) é usar sudo -i que leva você 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ê sai desse shell, você está ainda trouxe de volta onde você começou na hierarquia de diretórios exatamente pela mesma razão que eu descrevi acima.


16
2018-05-07 07:27



Essa explicação foi legal e sua parte sobre "Então, mesmo se sudo cd /somewhere fez exatamente o que diz na lata, no momento sudo saídas, você é trazido de volta onde você começou. "foi útil. +1 - harperville


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

sudo sh -c "cd restricted-dir; some_command"

12
2017-11-07 06:00



Eu gosto mais desta solução porque você faz o seu material root, então retorna imediatamente para o modo não-root para que você não esqueça e cometa Big Bugs. - GlenPeterson


Você também pode alterar a permissão temporariamente. chmod 0775 caminho. Certifique-se de colocá-lo de volta, se necessário.


3
2017-11-07 17:14



Bem-vindo ao Ask Ubuntu! Eu recomendo editaresta resposta para expandi-lo com detalhes específicos sobre como fazer isso. (Veja também Como escrevo uma boa resposta? para conselhos gerais sobre quais tipos de respostas são consideradas mais valiosas no AskUbuntu.) - David Foerster
Eu não tenho o direito de executar um shell interativo com o sudo, então este é o melhor caminho a percorrer. - Guillaume