“sudo cd…” one-liner? [duplicado]

20

Ocasionalmente, quero cd em um diretório em que meu usuário não tem permissão, então recorro a sudo .

O comando óbvio sudo cd somedir não funciona:

$ sudo mkdir test
$ sudo chmod go-rxw test
$ ls -l
drwx------ 2 root     root  [...snip...] test
$ cd test
-bash: cd: test: Permission denied
$ sudo cd test
sudo: cd: command not found

Usando sudo su works:

$ sudo su
# cd test

É possível transformar isso em uma única linha? (Não é grande coisa, apenas curiosidade ociosa:)

As variações que tentei não funcionaram:

$ sudo "cd test"
sudo: cd: command not found
$ sudo -i cd test
-bash: line 0: cd: test: No such file or directory
$ sudo -s cd test

O último não dá um erro, mas cd está dentro de um novo shell que sai no final da linha, então não me leva a lugar nenhum.

Alguém pode me esclarecer por que isso acontece? Por que sudo cd não é encontrado, quando, por exemplo, sudo ls ... funciona bem?

    
por j-g-faustus 02.01.2011 / 16:36

2 respostas

21

Teoricamente, o problema é que, se você não tiver direitos de execução em um diretório, não poderá ler o conteúdo do diretório. Agora suponha que você poderia fazer o que queria:

user@desktop:/$ sudo cd restricted-dir
user@desktop:/restricted-dir$ ls
file1 file2

Como você pode ver, você entrou no diretório usando privilégios sudo e, quando sudo retorna, você se torna um usuário novamente, e você está em um diretório onde você normalmente não deveria estar.

Tecnicamente, o problema é o seguinte.

sudo cd restricted-dir

cd é um shell embutido, não um comando.

sudo cd -i restricted-dir

Você provavelmente está em / root, mas teria o mesmo problema que o próximo.

sudo cd -s restricted-dir

Você abre um novo shell de root, cd no diretório, sai do shell de root e retorna para onde começou.

Em suma, a única solução é abrir um shell de root e mantê-lo aberto enquanto você estiver nesse diretório.

    
por petersohn 02.01.2011 / 16:52
5
sudo sh -c "cd restricted-dir; some-other-command"

ou seja,

sudo sh -c "cd /root/restricted-dir; ls -l"

a chave é "sh -c", que eu uso com bastante frequência para executar uma cadeia de comandos no mesmo contexto / processo da shell.

    
por Tagar 07.11.2015 / 06:56