Como inserir um diretório com o comando 'cd' se ele tiver 700 permissões e não for de minha propriedade?

51

Eu tentei usar sudo cd name_of_dir , mas recebi a mensagem de erro:

sudo: cd: command not found

Existe alguma outra maneira de inserir um diretório de outro usuário que tenha 700 permissões?

    
por Bakhtiyor 19.08.2011 / 12:43

7 respostas

72

sudo cd não funcionará porque o comando cd está embutido no shell. Então você está dizendo que se torne root e então execute este comando. Você se torna root e depois o comando após o sudo ser procurado, mas não há nenhum comando cd para localizar.

O método a ser usado é alternar para o usuário que possui o diretório. Permissão 700 significa "proprietário pode ler, escrever e executar".

Portanto, se root possuir o diretório sudo -i , password e, em seguida, cd {dir} será o único método correto. Se outra pessoa possuir o diretório, você ainda poderá usar o 1º método, mas também poderá alterar esse usuário com su {username} e, em seguida, usar cd como esse usuário.

    
por Rinzwind 19.08.2011 / 13:27
28

sudo -i

para abrir "console raiz" e, em seguida,

cd /path/to/directory

( cd é um comando interno do shell, portanto, não pode ser o destino do sudo)

    
por Vojtech Trefny 19.08.2011 / 12:57
15

Para abrir um diretório raiz, podemos executar um shell de root, por exemplo:

sudo su
# cd /root
    
por Takkat 19.08.2011 / 12:55
6

Como outros salientaram - é embutido no shell:

~ % which cd
cd: shell built-in command

Então, por que você não usa a própria shell?

~ % sudo $SHELL -c "cd name_of_dir"
    
por Daniel Bauke 19.08.2011 / 20:52
3

Você também pode se elevar para o usuário root por:

sudo -s

Em seguida, você pode criar um cd para qualquer diretório que não permita o usuário normal, como:

cd /root

Ou

cd /var/lib/

Depois que você terminar, digite:

exit

Para fazer logout dos privilégios do usuário root.

Para se elevar como root, você também pode combinar os dois comandos por && operator como abaixo, este operador também mantém sua seqüência de execução, se o comando atual for executado com sucesso e somente então o próximo comando puder ser executado:

sudo -s && cd /var/lib

Ou

sudo -s && cd /root
    
por Vicky Dev 05.10.2016 / 07:15
1

Se você realmente quiser fazer sudo cd directory work, você pode definir uma função bash chamada sudo que executa um novo shell root quando executada dessa forma, e apenas executa o comando normal sudo caso contrário. / p>

Como apresentado em outras respostas, a maioria dos usuários não quer se incomodar em fazer isso, mas preferirá:

  1. Execute sudo -s ou sudo -i se você quiser um shell de login (lembre-se de que um efeito de sudo -i é para iniciá-lo no diretório inicial do root) ou sudo bash se você quiser forçar bash ou ser capaz de passar opções para o shell.
  2. Execute cd directory no novo shell.
  3. Execute qualquer outra ação que precise ser tomada como root no novo shell.
  4. Depois de concluído, execute exit para deixar o novo shell. É importante não esquecer isso, porque você não quer executar mais ações como root do que você pretende!

Então, se você quiser, pode escrever uma função de shell (ou um script) que execute as duas primeiras ações quando sudo for seguido por cd e apenas executar sudo normalmente. Por favor, não use isso como uma alternativa para aprender porque sudo cd não tem sucesso , porque se você não entende o que está acontecendo, então você provavelmente será muito confuso por estar em um novo shell (e você pode não entender qualquer mensagem de erro que ocorra).

Aqui está uma maneira de escrever uma função de shell, que também lembra que você está em um novo shell e que você deve exit sair quando terminar. (Esse lembrete provavelmente será útil para usuários do nível de habilidade any , porque geralmente não estamos acostumados a estar em um novo shell quando um executa sudo sem -s , -i ou o nome de uma shell real como argumento.)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "" = 'cd' ]; then
        sudo bash -c '
                if cd -- ""; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "
[email protected]:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
[email protected]:~$ sudo -k  # invalidates my current timestamp... like I left for a while
[email protected]:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
[email protected]:/root/.local#
[email protected]:/root/.local#
[email protected]:/root/.local# exit
exit
[email protected]:~$
" "$USER" "" >&2 printf "%s: Type \"exit\" once you are done!\n" "
[email protected]:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
[email protected]:~$ sudo -k
[email protected]:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
[email protected]:~$
" >&2 exec bash # Replace this bash shell with an interactive one. fi ' bash _ "" # Use as the dir in the intermediate shell, too. else command sudo "[email protected]" fi }

Você poderia colocar isso no seu ~/.bashrc , embora essa seja uma maneira bastante estranha de usar o sudo que você pode querer ativá-lo ocasionalmente. Nesse caso, é melhor colocá-lo em seu próprio arquivo. Se você criar um arquivo chamado sudo.bash em seu diretório pessoal com esse conteúdo, poderá disponibilizar a função sudo - para que ela seja executada em vez do comando sudo normal - executando . ~/sudo.bash . Isso entra em vigor no shell atual e em seus shells filhos, mas não em outros. Pela mesma razão que arquivos como .bashrc não são executáveis, não marque sudo.bash executável com chmod . Isso é realmente uma biblioteca, em vez de um script de shell independente. Se você fez executá-lo como um script de shell, ele definiria a função ... mas apenas no shell que executou o script, não para você como o chamador. (Claro, você pode escrever um script para isso, essa não é a abordagem que tomei aqui.)

Para verificar se sudo está atualmente definido como uma função de shell e para ver sua definição atual, se for uma, execute type sudo . Para desabilitar (ou seja, indefinir) a função, uma vez definida, execute unset -f sudo . Para executar manualmente o comando regular sudo diretamente, mesmo se a função do shell estiver definida, execute command sudo . Note, no entanto, que você não tem para fazer isso, porque essa função sudo realmente faz isso por si mesma sempre que há mais ou menos de dois argumentos passados ou o primeiro argumento é passado é tudo menos cd . É por isso que você ainda pode usá-lo da maneira normal que as pessoas usam sudo .

Note também que a função de shell mostrada acima ainda permite que você passe outros argumentos para sudo , mas isso evitará que ele trate cd special . A execução de sudo -u user cd directory em particular não é suportada, embora você possa estender a função do shell para suportar esse caso. Nem é sudo -i cd directory . O shell que ele cria é semelhante ao que você obtém com sudo -s . Na verdade, o código não executa sudo -s , mas usa sudo bash , portanto a opção -c funciona corretamente. Na verdade, ele executa bash duas vezes quando você passa cd e um argumento de diretório para ele (e zero vezes caso contrário). Quando você executa sudo cd directory , primeiro ele extrai um shell bash separado daquele em que você está executando a função sudo e altera o diretório. Se isso for bem sucedido, substitui o bash shell por um novo e interativo que você pode usar.

Aqui está um exemplo de como essa função shell automaticamente "faz a coisa certa". Observe que sudo ls -A /root se comporta normalmente. Somente quando eu tentar cd em um diretório com sudo é um novo shell criado, e sou lembrado explicitamente do que está acontecendo.

%pre%

Se você tentar sudo cd em um diretório que você não pode alterar como raiz, você receberá uma mensagem de erro:

%pre%

Eu usei sudo -k entre invocações nos exemplos acima para mostrar que ele autentica você como root antes tentando alterar o diretório. Mas você não precisa executar sudo -k . Como a função shell é apenas um wrapper fino para o comando sudo real , o armazenamento em cache de suas credenciais e outros comportamentos comuns de sudo ainda funcionam normalmente.

Apesar de funcionar bem e ser legal, admito que sombrear o comando sudo real com uma função com o mesmo nome é super estranho. A maioria dos usuários provavelmente desejará executar as etapas sudo -s , cd directory . Mas no caso de alguém querer isso - e também para demonstrar que é possível - aí está.

    
por Eliah Kagan 11.12.2017 / 01:04
0

No que diz respeito a su ou não a su , acho que é bobagem. su é contra a religião do Ubuntu e não é algo a fazer descuidadamente. É incrível o que um rm -rf * pode fazer se você for root. Mas, se você estiver confortável com a interface de linha de comando (CLI) e tiver tarefas no nível do sistema para fazer, não há motivo para não usar su . Eu usei várias distros onde ninguém mencionou usando sudo . É apenas uma questão de que tipo de trabalho você está fazendo e com qual método você se sente mais confortável. Eu uso os dois.

    
por Joe 25.08.2011 / 07:34