¿Por qué no funciona 'sudo cd / var / named'? [duplicar]

147

Quiero cd en /var/named pero me da un error de permiso denegado, y cuando quiero usar sudo para hacerlo, no estoy permitido. ¿Cuál es la razón técnica para esto y es posible hacerlo de otra manera?

    
pregunta Hojat Taheri 06.05.2013 - 21:02

5 respuestas

205

La razón por la que no puedes hacer esto es simple y dos veces

1

cd no es un programa sino un comando incorporado y sudo solo se aplica a los programas.

sudo foo significa ejecutar el programa foo como root

sudo cd /path regresa

sudo: cd: command not found

porque cd no es un programa.

2

Si fuera posible usar sudo para cd a un directorio protegido y luego ejecutar el comando sudo cd /var/named , estaría en ese directorio como un usuario normal, pero los usuarios normales no pueden estar en ese directorio.

Esto no es posible.

Solución:

Puedes usar sudo -i para elevarte a un súper usuario. Por ejemplo:

sudo -i
cd /var/named 

Ahora está conectado como root y puede usar los comandos que desee. Cuando haya terminado, escriba exit y vuelva a iniciar sesión como usuario normal.

    
respondido por el Warren Hill 06.05.2013 - 21:30
25

Eso es porque cd no es un ejecutable, es una función de shell para cambiar de directorio.

Si ejecuta:

type cd

obtendrá:

  

cd es una función de shell

Puedes usar sudo -s para abrir un shell interactivo y luego cd para tu directorio deseado:

sudo -s
cd /var/named

Para volver a tu caparazón normal simplemente presiona Ctrl + D .

    
respondido por el Basharat Sialvi 06.05.2013 - 21:29
16

También vale la pena recordar que, a pesar del estado de cd como un builtin de shell o un binario externo, sudo funciona al generar un nuevo proceso para ejecutar el comando especificado .

¿Por qué es esto importante? Porque el flujo de ejecución básico de sudo se convierte en algo muy similar a esto:

  1. El shell genera un subproceso para ejecutar sudo con los parámetros dados
  2. sudo autentica al usuario y confirma su derecho a ejecutar el comando especificado
  3. sudo genera un subproceso para ejecutar el comando especificado
  4. sudo espera a que se genere el subproceso en el paso 3 para salir
  5. sudo sale, regresa al shell
  6. El subproceso generado en el paso 1 finaliza, devolviendo al usuario al indicador del shell

(Este puede ser técnicamente ligeramente incorrecto; hay una llamada al sistema que en realidad reemplaza el proceso en ejecución por uno nuevo (esa es la C% s execve() ). Sin embargo, a los efectos de esta explicación, los dos son equivalentes).

Esto se vuelve importante cuando se considera que el directorio de trabajo actual es una propiedad de cada proceso y se hereda pero no se promueve . Entonces, si el proceso A genera un nuevo proceso B, entonces el proceso B comienza con el mismo directorio de trabajo en el que estaba el proceso A. (Por eso algo tan mundano como ls ./ hace lo que cabría esperar). Pero si el proceso B cambia su directorio de trabajo, entonces, a menos que el proceso A se salga de su camino buscando eso, A está completamente inconsciente de ese cambio. (Esto, a su vez, es la razón por la cual si ejecutas algo como find / y lo cancelas a la mitad, no terminas en una ubicación aparentemente aleatoria en el sistema de archivos solo porque find estaba mirando allí en ese momento fue abortado).

Así que incluso si sudo cd /somewhere hizo exactamente lo que dice en la lata, para el momento en que sudo salga, volverá al lugar donde comenzó. Por lo tanto, efectivamente desde el punto de vista del usuario, se convierte en un no-op. El hecho de que cd , mientras se estaba ejecutando, llamó a la función de biblioteca del sistema chdir() para establecer un nuevo directorio de trabajo, no le ayuda a usted, el usuario.

Como Warren Hill señaló, la solución adecuada (en realidad, no me llamaría es una solución) es usar sudo -i que lo lleva a un shell raíz donde puede navegar libremente por el sistema de archivos y ejecutar los comandos que desee. Sin embargo, tenga en cuenta que cuando salga de este shell, todavía regresó a donde comenzó en la jerarquía del directorio exactamente por la misma razón que describí anteriormente.

    
respondido por el Michael Kjörling 07.05.2013 - 09:27
12

Todas las respuestas anteriores son correctas; aquí hay una solución, aunque

sudo sh -c "cd restricted-dir; some_command"
    
respondido por el Tagar 07.11.2015 - 07:00
3

También puede cambiar el permiso temporalmente. ruta chmod 0775 Asegúrate de volver a colocarlo si es necesario.

    
respondido por el Andres Abello 07.11.2016 - 18:14

Lea otras preguntas en las etiquetas