¿Cómo ingresar a un directorio con el comando 'cd' si tiene 700 permisos y no es de mi propiedad?

87

Traté de usar sudo cd name_of_dirpero recibo el mensaje de error:

sudo: cd: command not found

¿Hay alguna otra forma de ingresar a un directorio propiedad de otro usuario que tenga 700 permisos?

Bakhtiyor
fuente
2
agregue uno ls -ldel directorio en sí.
Rinzwind
77
Y explique por qué sigue dejando comentarios negativos contra las respuestas válidas aquí. Si cree que hay (o debería haber) una mejor manera, háganos saber cuál podría ser.
Oli
1
sudo chmod 0755 name_of_dir; do you business; cd ../; sudo chmod 0700 name_of_dirParece ser la única respuesta con la que estarás contento.
Marco Ceppi
3
Las respuestas dadas aquí son correctas, pero las está rechazando y diciendo que están equivocadas. No descarte lo que se dice por algo más que haya visto.
Richard Holloway
3
Eso es divertido ... él quiere sudo cdtrabajar, pero vota las soluciones usando sudo o su. Él dice que no quiere trabajar como root, pero que aún quiere acceder a uno directamente que no posee. A mí me parece un troll ...
MestreLion

Respuestas:

111

sudo cdno funcionará porque el cdcomando está integrado en el shell. Entonces dices hazte root y luego ejecuta este comando. Se convierte en root y luego se busca el comando después de buscar sudo pero no hay ningún cdcomando para encontrar.

El método a utilizar es cambiar al usuario que posee el directorio. Permiso 700se entiende como "el propietario puede leer, escribir y ejecutar".

Entonces, si la raíz posee el directorio sudo -i, la contraseña cd {dir}es el único método correcto. Si alguien más posee el directorio, aún puede usar el primer método, pero también puede cambiar a ese usuario su {username}y luego usarlo cdcomo ese usuario.

Rinzwind
fuente
Pregunta secundaria: ¿podrá el root ingresar un directorio 700 incluso si él no es el propietario?
MestreLion
3
sí MestreLion, 700 no impedirá que root se entretenga. Los permisos '000' evitarán que el usuario ingrese a sí mismo (sí, un usuario puede crear un directorio que él mismo no puede ingresar ...) pero aún la raíz puede ingresar ese.
Rinzwind
1
echo es un comando incorporado de shell, ¿por qué puedo ejecutar "sudo echo" pero no "sudo cd"?
shoujs
Lo sentimos, se aplican las mismas reglas sudo echo: necesita algo como echo 'deb {text}' | sudo tee --append {file}usar echo con sudo y cambiar un archivo.
Rinzwind
1
Sin embargo, ¿por qué no está cdintegrado en los comandos disponibles sudo?
Aaron Franke el
44

sudo -i

para abrir la "consola raíz" y luego

cd /path/to/directory

( cdes un comando integrado de shell, por lo que no puede ser el objetivo de sudo)

Vojtech Trefny
fuente
19

Para abrir un directorio raíz, podemos ejecutar un shell raíz, por ejemplo:

sudo su
# cd /root
Takkat
fuente
3
No me gustaría trabajar como root. ¡¡¡NUNCA!!! Y también los expertos recomiendan nunca iniciar sesión como root. -1
Bakhtiyor
8
Bueno, eso es exactamente por qué no quieres permisos para abrir los directorios raíz, ¿no?
Takkat
10
No hay nada malo en entrar en modo raíz. Los expertos siempre recomendarán ir a la raíz cuando sea necesario.
Rinzwind
2
Si está trabajando con cosas propiedad de root, a veces sudo suing (u otro método) es el único método práctico o incluso posible. Los "expertos" solo le dicen que no use la raíz como un hábito; está bien cuando realmente lo necesita. Y @Vojtech, nada es imposible ...
Oli
2
@Bakhtiyor: no se recomienda trabajar todo el tiempo como root. Pero emitirlo para un solo (o algunos) comandos es aceptable. Especialmente si está intentando ingresar a un directorio para el cual su usuario no tiene permiso . Por lo tanto, debe ser el propietario o la raíz.
MestreLion
10

Como otros señalaron, su shell está incorporado:

~ % which cd
cd: shell built-in command

Entonces, ¿por qué no sudo la concha en sí?

~ % sudo $SHELL -c "cd name_of_dir"
Daniel Bauke
fuente
55
+1 para la idea sudo bash -c ... y una sugerencia: evite usar which. Es simplemente un script, y no manejará todas las posibilidades (binario, incorporado, alias, etc.). Usar en su typelugar. Mucho más seguro, potente y portátil. Y type -ppara el camino de un ejecutable.
MestreLion
1
Bueno, depende ;-) type [ -wfpams ] name ... Equivalent to whence -v., which [ -wpams ] name ... Equivalent to whence -c.(hombre zshbuiltins)
Daniel Bauke
1
No , no dependen. whencees zsh-solo ... no funciona en bash, ni siquiera está instalado por defecto en ubuntu. Si bien typees POSIX , significa que funcionará en cualquier shell moderno ... bash, csh, ksh ... e incluso zsh.
MestreLion
Claro, lo es y es por eso que voté tu comentario justo cuando apareció, pero lo que dije fue que en zsh en realidad no es un script y da resultados similares, ya typeque ambos son alias del mismo comando.
Daniel Bauke
Oh ahora entiendo. Bueno, pero eso es todo zsh. En bash, que es el shell de terminal predeterminado (y generalmente solo) en Ubuntu, whichno está integrado ... por lo que se prefiere type(o type -p).
MestreLion
4

También puede elevarse a usuario root mediante:

sudo -s

Luego puede cd a cualquier directorio que no permita usuarios normales como:

cd /root

O

cd /var/lib/

Luego, una vez que hayas terminado allí, escribe:

exit

Para cerrar sesión de los privilegios de usuario root.

Para elevarse como root, también puede combinar los dos comandos por &&operador como se muestra a continuación, este operador también mantiene su secuencia de ejecución, si el comando actual se ejecuta con éxito y solo entonces se permite la ejecución del siguiente comando:

sudo -s && cd /var/lib

O

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

Si realmente desea hacer que funcione, puede definir una función de shell llamada que ejecuta un nuevo shell raíz cuando se ejecuta de esa manera, y simplemente ejecuta el comando regular de lo contrario.sudo cd directorybashsudosudo

Como se presenta en otras respuestas, la mayoría de los usuarios no querrán molestarse en hacer eso, sino que querrán:

  1. Ejecute sudo -s, o sudo -isi desea un shell de inicio de sesión (recuerde que uno de los efectos sudo -ies iniciarlo en el directorio de inicio de la raíz), o sudo bashsi desea forzar basho poder pasar opciones al shell.
  2. Ejecutar en el nuevo shell.cd directory
  3. Realice cualquier (otra) acción que deba tomarse como raíz en el nuevo shell.
  4. Una vez hecho esto, corre exitpara salir del nuevo shell. ¡Es importante no olvidar esto, porque no desea realizar más acciones como root de lo que pretende!

Por lo tanto, si lo desea, puede escribir una función de shell (o una secuencia de comandos) que realice las dos primeras de esas acciones cuando sudole siga cd, y que de lo sudocontrario se ejecuta normalmente. No utilice esto como una alternativa para aprender por qué sudo cd no tiene éxito de otra manera , porque si no comprende lo que está sucediendo, es probable que se sienta muy confundido al estar en un nuevo shell (y es posible que no entienda ningún mensaje de error eso ocurre).

Aquí hay una forma de escribir dicha función de shell, que también le recuerda que está en un nuevo shell y que debe exitsalir de él cuando haya terminado. (Eso recordatorio es probable que sea útil para los usuarios de cualquier nivel de habilidad, ya que uno no es generalmente acostumbrado a estar en un nuevo shell cuando se corre sudosin -s, -io el nombre de una cáscara real como un 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
}

Puede poner esto en su ~/.bashrc, aunque esta es una forma lo suficientemente extraña de usar sudoque es posible que solo desee habilitarlo ocasionalmente. En ese caso, es mejor ponerlo en su propio archivo. Si crea un archivo llamado sudo.bashen su directorio de inicio con esos contenidos, puede hacer que la sudofunción esté disponible, para que se ejecute en lugar del sudocomando normal , ejecutándose . ~/sudo.bash. Eso tiene efecto en el caparazón actual y sus caparazones secundarios, pero no en otros. Por la misma razón por la que los archivos como .bashrcno son ejecutables, no marque el sudo.bashejecutable con chmod. Esto es realmente una biblioteca, en lugar de un script de shell independiente. Si lo hicierasejecutarlo como un script de shell, definiría la función ... pero solo en el shell que ejecutó el script, no para usted como la persona que llama. (Por supuesto, usted puede escribir un guión para esto, que simplemente no resultan ser el enfoque que he tomado aquí.)

Para verificar y ver si sudoactualmente está definido como una función de shell, y para ver su definición actual si es una, ejecute type sudo. Para deshabilitar (es decir, no definir) la función una vez que está definida, ejecute unset -f sudo. Para ejecutar manualmente el sudocomando regular directamente, incluso si la función de shell está definida, ejecute command sudo. Sin embargo, tenga en cuenta que no tiene que hacer eso, porque esta sudofunción realmente lo hace por sí misma cada vez que se le pasan más o menos dos argumentos o el primer argumento que se le pasa es todo menos eso cd. Es por eso que todavía puede usarlo de la manera normal que usan las personas sudo.

Tenga en cuenta también que la función de shell que se muestra arriba todavía le permite pasar otros argumentos sudo, pero eso evitará que se trate cdespecialmente . La ejecución en particular no es compatible, aunque podría ampliar la función de shell para admitir ese caso. Tampoco lo es . El shell que crea es similar a lo que obtienes . El código no se ejecuta realmente , sino que lo usa , por lo que la opción funciona correctamente. En realidad, se ejecuta dos veces cuando pasa y un argumento de directorio (de lo contrario, cero veces). Cuando ejecuta , primero se bifurca un shell bash separado del que está ejecutando la función y cambia el directorio. Si eso tiene éxito, reemplazasudo -u user cd directorysudo -i cd directorysudo -ssudo -ssudo bash-cbashcdsudo cd directorysudo ese bash shell con uno nuevo e interactivo que puedes usar.

Aquí hay un ejemplo de cómo ese shell funciona automáticamente "hace lo correcto". Tenga en cuenta que se sudo ls -A /rootcomporta normalmente. Solo cuando intento acceder cda un directorio con sudose crea un nuevo shell y se me recuerda explícitamente lo que está sucediendo.

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:~$

Si intenta sudo cdacceder a un directorio que no puede cambiar incluso como root, recibirá un mensaje de error:

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:~$

He utilizado sudo -kentre invocaciones en los ejemplos anteriores para mostrar que lo autentica como root antes de intentar cambiar el directorio. Pero en realidad no tienes que correr sudo -ktú mismo. Debido a que la función de shell es solo una envoltura delgada para el sudocomando real , el almacenamiento en caché de sus credenciales y otros sudocomportamientos comunes todavía funcionan normalmente.

Aunque funciona bien y es bastante ordenado, admito que sombrear el sudocomando real con una función del mismo nombre es muy extraño. La mayoría de los usuarios probablemente sólo quieren llevar a cabo los pasos sudo -s, a sí mismos. Pero en caso de que alguien quiera esto, y también para demostrar que es posible, ahí está.cd directory

Eliah Kagan
fuente
0

En cuanto sual sudebate o no , creo que es una tontería. suestá en contra de la religión de Ubuntu y no es algo que hacer descuidadamente. Es sorprendente lo que rm -rf *puedes hacer si eres root. Pero, si se siente cómodo con la interfaz de línea de comandos (CLI) y tiene tareas de nivel de sistema que hacer, no hay razón para no usarsu . He usado varias distribuciones donde nadie mencionó usarlas sudo. Es solo una cuestión de qué tipo de trabajo está haciendo y con qué método se siente más cómodo. Yo uso ambos.

Joe
fuente
1
"En las versiones de bash y sudoque tengo con kubuntu lucid, sudo cdahora funciona, sin ninguna solución". A falta de algo así , que estoy bastante seguro de que nunca ha estado en Ubuntu por defecto, no veo cómo. (Además, he usado 10.04; no lo hizo). Han pasado años desde que publicaste esto, pero ¿recuerdas los detalles? ¿ sudo cdAún te funciona? ¿Cuál es la salida de type -a sudoun shell donde funciona? Entiendo que puede que no lo sepas, y la segunda parte de tu respuesta sigue siendo relevante, pero si lo haces, puedes editarlo .
Eliah Kagan
@EliahKagan Definitivamente no funciona para mí ahora en 16.10 y no recuerdo lo que hice entonces. Está en contra de mi religión modificar los comandos base existentes, por lo que es poco probable que lo haya hecho. En cualquier caso, incluso si funcionara, todos lo llamarían un mal hábito porque no funcionaría en general.
Joe