Anoche estaba trabajando en el desarrollo de mis habilidades en la línea de comandos y me encontré con un problema en el que cuando usaba sudo recibía un mensaje de error que decía 'permiso denegado'. Sin embargo, cuando usé 'sudo su' y me convertí en root, el comando funcionó.
¿Por qué el sudo no funcionó en primera instancia?
Era:
$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D
De la edición Linux Bible 2010 en la sección sobre cómo configurar un servidor LAMP.
command-line
wdypdx22
fuente
fuente
sudo -s
mássudo su
.Respuestas:
<,> Y >> se utilizan para la redirección de entrada / salida para comandos, que es una característica proporcionada por el shell (por ejemplo, bash). Entonces, si escribe un comando como
sudo cat > /var/www/info.php
entonces, el shell que lo recibe como entrada intenta abrir el archivo/var/www/info.php
y proporciona ese archivo como salida estándar para elsudo
comando. Elsudo
comando ni siquiera sabe si su salida se dirige a una consola o se redirige a un archivo, porque el shell que lo invoca se ocupa de esto.Si el shell en el que escribió su comando es su shell de inicio de sesión u otro shell que se ejecuta en una terminal con su ID de usuario, entonces tiene los mismos privilegios que su ID de usuario, no los de root.
Entonces, en su caso, mientras que el comando cat se ejecuta como root, la copia de su salida
/var/www/info.php
se intenta mediante el shell que se ejecuta como un usuario normal, que, como se esperaba, falla.Una solución para tales situaciones es usar el
tee
comando:Eso tendrá el efecto deseado de poner todo el texto ingresado en la consola hasta ^ D en el archivo especificado como parámetro.
Un efecto secundario quizás comprensible es que
tee
también hará eco de la salida a la salida estándar, por lo que después de escribir cada línea y presionar entertee
, se devolverá una copia. Para evitar esto, puede usar la siguiente variante.Los detalles se
tee
pueden obtener a travésinfo tee
de una terminal.fuente
sudo no funciona para comandos que necesitan permisos para escribir un archivo, como:
sudo echo "vm.swappines = 100" >> /etc/sysctl.conf
Se explica en la página de manual de sudo.
fuente
sudo
. Como se señaló en la respuesta de koushik, el comportamiento es bastante predecible, consistente y "correcto" para el modelo de permiso de Unix.El problema es que el intérprete de comandos (shell) interpreta y ejecuta la parte "> foo.txt" mucho antes de que se ejecute el comando sudo. El comando sudo no tiene idea de que desea redirigir su salida a un archivo.
Su intérprete de comandos no tiene autoridad de root (pero el comando sudo eventualmente lo hará más tarde) por lo que no puede redirigir la salida a foo.txt.
fuente
Otra forma de resolver esto es iniciar una subshell con sudo y ejecutar ese comando en esa subshell:
aquí, el comando que "tiene sudo" es bash, y todo lo que se ejecute en él tiene permisos de root.
$ 2c, * -pike
fuente