¿Usando sudo su para los comandos?

15

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.

wdypdx22
fuente
Si no da un ejemplo, es difícil resolver el problema.
LassePoulsen
1
Considerar sudo -smás sudo su.
Jeremy L

Respuestas:

18

<,> 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.phpentonces, el shell que lo recibe como entrada intenta abrir el archivo /var/www/info.phpy proporciona ese archivo como salida estándar para el sudocomando. El sudocomando 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.phpse 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 teecomando:

sudo tee /var/www/info.php

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 teetambién hará eco de la salida a la salida estándar, por lo que después de escribir cada línea y presionar enter tee, se devolverá una copia. Para evitar esto, puede usar la siguiente variante.

sudo tee /var/www/info.php > /dev/null

Los detalles se teepueden obtener a través info teede una terminal.

koushik
fuente
2

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.

NightwishFan
fuente
44
¡Mencionar que puede "sudo -i" o "sudo -s" para obtener un mensaje raíz hará que esta respuesta sea aún mejor!
Jorge Castro
No hay canalización en el comando de ejemplo; Hay una redirección. Además, "a veces no funciona" parece transmitir un comportamiento escamoso 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.
msw
2

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.

Thorbjørn Ravn Andersen
fuente
1

Otra forma de resolver esto es iniciar una subshell con sudo y ejecutar ese comando en esa subshell:

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

aquí, el comando que "tiene sudo" es bash, y todo lo que se ejecute en él tiene permisos de root.

$ 2c, * -pike

Pico común
fuente