Como inserir um diretório com o comando 'cd' se ele tem permissão para 700 e não é de minha propriedade?

87

Eu tentei usar, sudo cd name_of_dirmas estou recebendo a mensagem de erro:

sudo: cd: command not found

Existe alguma outra maneira de inserir um diretório pertencente a outro usuário com 700 permissões?

Bakhtiyor
fonte
2
por favor adicione um ls -ldiretório próprio.
Rinzwind 19/08/11
7
E explique por que você continua deixando comentários negativos contra as respostas válidas aqui. Se você acha que existe (ou deveria existir) uma maneira melhor, informe-nos qual pode ser.
Oli
11
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirParece ser a única resposta com a qual você ficará feliz.
Marco Ceppi
3
As respostas dadas aqui estão corretas, mas você as está votando e dizendo que estão erradas. Não descarte apenas o que está sendo dito por causa de outra coisa que você já viu.
Richard Holloway
3
Isso é engraçado ... ele quer sudo cdtrabalhar, mas vota soluções usando sudo ou su. Ele diz que não quer trabalhar como root, mas ainda quer acessar diretamente um que não possui. Soa como um troll para mim ...
MestreLion

Respostas:

111

sudo cdnão funcionará porque o cdcomando está embutido no shell. Então você está dizendo tornar-se root e, em seguida, execute este comando. Você se torna root e, em seguida, o comando após a busca do sudo, mas não há cdcomando a ser encontrado.

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

Portanto, se o root possui o diretório sudo -i, a senha e, em seguida, cd {dir}é o único método correto. Se outra pessoa possuir o diretório, você ainda poderá usar o 1º método, mas também poderá mudar para esse usuário su {username}e, em seguida, usá- cdlo.

Rinzwind
fonte
Pergunta secundária: o root poderá inserir um 700 dir, mesmo que ele não seja o proprietário?
MestreLion
3
sim MestreLion, 700 não impedirá a inserção do root. As permissões '000' impedem o usuário de entrar nele (sim, um usuário pode criar um diretório que ele próprio não pode entrar ...), mas ainda assim o root pode entrar nesse.
Rinzwind
11
echo é um comando de compilação do shell, por que eu posso executar "sudo echo", mas não "sudo cd"?
shoujs 31/08/16
Desculpe, as mesmas regras se aplicam a sudo echo: você precisa de algo como echo 'deb {text}' | sudo tee --append {file}usar echo com sudo e alterar um arquivo.
Rinzwind 31/08/16
11
Por que não está cdembutido nos comandos disponíveis sudo?
Aaron Franke
44

sudo -i

para abrir "console raiz" e depois

cd /path/to/directory

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

Vojtech Trefny
fonte
19

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

sudo su
# cd /root
Takkat
fonte
3
Eu não gostaria de trabalhar como raiz. NUNCA!!! E também especialistas recomendam nunca fazer login como raiz. -1
Bakhtiyor 19/08/11
8
Bem, é exatamente por isso que você não deseja permissões para abrir diretórios raiz, não é?
Takkat 19/08/11
10
Não há nada de errado em entrar no modo raiz. Os especialistas sempre recomendam entrar na raiz quando necessário.
Rinzwind 19/08/11
2
Se você estiver trabalhando com coisas pertencentes à raiz, às vezes sudo suing (ou outro método) é o único método prático ou até possível. Os "especialistas" apenas dizem para você não usar a raiz como hábito - tudo bem quando você realmente precisa. E @Vojtech, nada é impossível ...
Oli
2
@ Bakhtiyor: trabalhar o tempo todo como root não é recomendado. Mas emitir para um único (ou alguns) comandos é aceitável. Especialmente se você estiver tentando inserir um diretório ao qual seu usuário não tem permissão . Então você precisa ser o proprietário ou a raiz.
MestreLion
10

Como outros apontaram - é o shell embutido:

~ % which cd
cd: shell built-in command

Então, por que você não sudo o próprio shell?

~ % sudo $SHELL -c "cd name_of_dir"
Daniel Bauke
fonte
5
+1 para a idéia sudo bash -c ... e uma sugestão: evite usar which. É apenas um script, e ele não manipulará todas as possibilidades (binário, interno, alias, etc.). Use em typevez disso. Muito mais seguro, poderoso e portátil. E type -ppara o caminho de um executável.
MestreLion
11
Bem, depende ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(man zshbuiltins) #
Daniel Bauke
11
Isso não depende. whenceé zsh-only ... não funciona no bash, nem é instalado por padrão no ubuntu. Enquanto typeé POSIX , significa que funcionará em qualquer shell moderno ... bash, csh, ksh .. e até zsh.
MestreLion
Claro, é por isso que votei no seu comentário exatamente quando ele apareceu, mas o que eu disse foi que, no zsh, na verdade não é um script e fornece resultados semelhantes, typepois ambos são aliases ao mesmo comando.
precisa saber é o seguinte
Oh, eu entendo agora. Bem, mas está aí zsh. No bash, que é o shell de terminal padrão (e geralmente apenas) no Ubuntu, whichnão é um builtin ... então type(ou type -p) é o preferido.
MestreLion
4

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

sudo -s

Então você pode fazer o cd para qualquer diretório que não permita ao usuário normal, como:

cd /root

Ou

cd /var/lib/

Depois que você terminar, digite:

exit

Para efetuar logout dos privilégios de usuário root.

Para elevar-se como root, você também pode combinar os dois comandos pelo &&operador, como abaixo, este operador também mantém sua sequência de execução, se o comando atual for executado com êxito e somente então o próximo comando poderá executar:

sudo -s && cd /var/lib

Ou

sudo -s && cd /root
Vicky Dev
fonte
2

Se você realmente deseja fazer o trabalho, pode definir uma função shell chamada que executa um novo shell raiz quando é executada dessa maneira e apenas executa o comando regular caso contrário.sudo cd directorybashsudosudo

Conforme apresentado em outras respostas, a maioria dos usuários não deseja se incomodar com isso, mas deseja:

  1. Execute sudo -s, ou sudo -ise você quiser um shell de login (lembre-se de que um dos efeitos sudo -ié iniciá-lo no diretório inicial do root), ou sudo bashse desejar forçar bashou conseguir passar opções para o shell.
  2. Execute no novo shell.cd directory
  3. Execute as ações (outras) que precisam ser tomadas como raiz no novo shell.
  4. Uma vez feito, corra exitpara deixar o novo shell. É importante não esquecer isso, porque você não deseja executar mais ações como raiz do que pretende!

Portanto, se você quiser, poderá escrever uma função de shell (ou um script) que execute as duas primeiras dessas ações quando sudofor seguida por cde execute sudonormalmente normalmente. Por favor, não use isso como uma alternativa para aprender por sudo cd que de outra forma não será bem-sucedido , porque se você não entender o que está acontecendo, provavelmente ficará muito confuso por estar em um novo shell (e você poderá não entender nenhuma mensagem de erro que ocorrem).

Aqui está uma maneira de escrever uma função de shell, que também lembra que você está em um novo shell e que deve exitsair dela quando terminar. (Esse lembrete é provável que seja útil para usuários de qualquer nível de habilidade, porque não é geralmente acostumados a estar em um novo shell quando se corre sudosem -s, -iou o nome de um shell real como um argumento.)

# Make sudo treat "sudo cd [DIRECTORY]" as a special case and start a shell.
sudo() {
    if [ "$#" -eq 2 ] && [ "$1" = 'cd' ]; then
        sudo bash -c '
                if cd -- "$2"; then # When cd fails, its own message is enough.
                    printf "%s: Running %s shell in %s\n" "$0" "$USER" "$2" >&2
                    printf "%s: Type \"exit\" once you are done!\n" "$0" >&2
                    exec bash # Replace this bash shell with an interactive one.
                fi
            ' bash _ "$2" # Use $2 as the dir in the intermediate shell, too.
    else
        command sudo "$@"
    fi
}

Você pode colocar isso no seu ~/.bashrc, embora essa seja uma maneira bastante estranha de usar, e sudovocê só pode querer habilitá-lo ocasionalmente. Nesse caso, é melhor colocá-lo em seu próprio arquivo. Se você criar um arquivo chamado sudo.bashno diretório inicial com esse conteúdo, poderá disponibilizar a sudofunção - para que ela seja executada em vez do sudocomando regular - 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 .bashrcnão são executáveis, não marque sudo.bashexecutável com chmod. Esta é realmente uma biblioteca, em vez de um script de shell independente. Se você fezexecutá-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, que simplesmente não é a abordagem que eu tomei aqui.)

Para verificar e ver se sudoatualmente está definido como uma função shell e para ver sua definição atual, se for uma, execute type sudo. Para desativar (ou seja, indefinir) a função, uma vez definida, execute unset -f sudo. Para executar manualmente o sudocomando regular diretamente, mesmo se a função shell estiver definida, execute command sudo. Observe, no entanto, que você não precisa fazer isso, porque essa sudofunção realmente faz isso sozinha sempre que houver mais ou menos de dois argumentos passados ​​para ela ou o primeiro argumento passado para ela for qualquer coisa menos isso cd. É por isso que você ainda pode usá-lo da maneira normal que as pessoas usam sudo.

Observe também que a função shell mostrada acima ainda permite passar outros argumentos sudo, mas isso impedirá que ela seja tratada cdespecialmente . A execução em particular não é suportada, embora você possa estender a função shell para suportar esse caso. Nem é . O shell que ele cria é semelhante ao que você recebe . Na verdade , o código não é executado , mas é usado , portanto, a opção funciona corretamente. Na verdade, ele é executado duas vezes quando você passa um argumento de diretório (e zero vezes caso contrário). Quando você executa , primeiro ele cria um shell bash separado daquele em que você está executando a função e altera o diretório. Se isso der certo, substituisudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo esse bash shell com um novo e interativo que você pode usar.

Aqui está um exemplo de como essa função de shell automaticamente "faz a coisa certa". Observe que sudo ls -A /rootse comporta normalmente. Somente quando tento acessar cdum diretório sudoé que um novo shell é criado e sou lembrado explicitamente do que está acontecendo.

ek@Io:~$ sudo ls -A /root
[sudo] password for ek:
.aptitude      .bashrc  .config  .emacs.d  .nano     .rpmdb
.bash_history  .cache   .dbus    .local    .profile
ek@Io:~$ sudo -k  # invalidates my current timestamp... like I left for a while
ek@Io:~$ sudo cd /root/.local
[sudo] password for ek:
bash: Running root shell in /root/.local
bash: Type "exit" once you are done!
root@Io:/root/.local#
root@Io:/root/.local#
root@Io:/root/.local# exit
exit
ek@Io:~$

Se você tentar sudo cdacessar um diretório para o qual não pode mudar mesmo como root, receberá uma mensagem de erro:

ek@Io:~$ sudo cd /nonexistent
[sudo] password for ek:
bash: line 1: cd: /nonexistent: No such file or directory
ek@Io:~$ sudo -k
ek@Io:~$ sudo cd /etc/crontab
[sudo] password for ek:
bash: line 1: cd: /etc/crontab: Not a directory
ek@Io:~$

Eu usei sudo -kentre invocações nos exemplos acima para mostrar que ele se autentica como raiz antes de tentar alterar o diretório. Mas você realmente não precisa se controlar sudo -k. Como a função shell é apenas um invólucro fino para o sudocomando real , o cache de suas credenciais e outros sudocomportamentos comuns ainda funcionam normalmente.

Embora funcione bem e seja meio arrumado, admito que sombrear o sudocomando real com uma função do mesmo nome é super estranho. A maioria dos usuários provavelmente só quero executar as etapas sudo -s, eles mesmos. Mas, caso alguém queira isso - e também para demonstrar que é possível - aí está.cd directory

Eliah Kagan
fonte
0

Quanto suao sudebate ou não , acho que é bobagem. sué contra a religião do Ubuntu e não é algo que se faça de maneira descuidada. É incrível o que uma pessoa rm -rf *pode fazer se você é um root. Mas, se você está familiarizado com a interface da linha de comandos (CLI) e tem tarefas no nível do sistema, não há razão para não usá-lo su. Eu usei várias distribuições onde ninguém sequer mencionou o uso sudo. É apenas uma questão de que tipo de trabalho você está realizando e com qual método você se sente mais confortável. Eu uso os dois.

Joe
fonte
11
"Nas versões do bash e sudoeu tenho com o kubuntu lucid, sudo cdagora funciona - sem nenhuma solução alternativa." Com menos de algo assim , que tenho certeza de que nunca esteve no Ubuntu por padrão, não vejo como. (Além disso, usei a versão 10.04; ela não fez isso.) Faz anos desde que você postou isso, mas você se lembra dos detalhes? Será que sudo cdainda funciona para você? Qual é o resultado de type -a sudoum shell onde ele funciona? Entendo que você talvez não saiba - e a segunda parte de sua resposta permanece relevante - mas, se souber, poderá editar sobre isso.
Eliah Kagan
@EliahKagan Definitivamente, agora não funciona para mim em 16.10 e não me lembro do que fiz na época. É contra a minha religião modificar os comandos base existentes, por isso é improvável que eu tenha feito isso. De qualquer forma, mesmo que funcionasse, todos chamariam isso de mau hábito, porque geralmente não funcionava.
21417 Joe