Me dieron acceso a sudo en una de nuestras cajas de desarrollo RedHat Linux, y parece que a menudo necesito redirigir la salida a una ubicación a la que normalmente no tengo acceso de escritura.
El problema es que este ejemplo artificial no funciona:
sudo ls -hal /root/ > /root/test.out
Acabo de recibir la respuesta:
-bash: /root/test.out: Permission denied
¿Cómo puedo hacer que esto funcione?
root
(en cuyo caso proceda a leer las respuestas) pero muy a menudo, simplemente necesita crear el archivo en otro lugar, como usted mismo.Respuestas:
Su comando no funciona porque la redirección la realiza su shell, que no tiene permiso para escribir
/root/test.out
. La redirección de la salida no es realizada por sudo.Hay múltiples soluciones:
Ejecute un shell con sudo y dele el comando usando la
-c
opción:Cree un script con sus comandos y ejecútelo con sudo:
Ejecutar
sudo ls.sh
. Vea la respuesta de Steve Bennett si no desea crear un archivo temporal.Inicie un shell con
sudo -s
luego ejecute sus comandos:Use
sudo tee
(si tiene que escapar mucho cuando usa la-c
opción):La redirección a
/dev/null
es necesaria para evitar que el tee salga a la pantalla. Para agregar en lugar de sobrescribir el archivo de salida (>>
), usetee -a
otee --append
(el último es específico de los coreutils de GNU ).Gracias a Jd , Adam J. Forster y Johnathan por la segunda, tercera y cuarta solución.
fuente
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Alguien aquí ha sugerido sudoing tee:
Esto también podría usarse para redirigir cualquier comando a un directorio al que no tenga acceso. Funciona porque el programa tee es efectivamente un programa de "eco a un archivo", y la redirección a / dev / null es evitar que también salga a la pantalla para mantenerlo igual que el ejemplo artificial original anterior.
fuente
sudo
(es decir, para el comando en sí) podría omitirseUn truco que descubrí yo mismo fue
fuente
sudo dd
es mejor que lossudo tee /root/file > /dev/null
ejemplos anteriores!dd
es el nombre del comando,of=/root/test.out
es el argumento que indicadd
cuáles son los archivos de salida.of
significa archivo de salida ydd
es una herramienta muy popular utilizada tanto en Linux como en OSX (principalmente para escribir imágenes en discos). Este es un buen truco seguro.dd
es probablemente igualmente útil comotee
aquí. En ambos casos, está utilizando un comando común y conocido para un propósito que, aunque es ligeramente diferente de su propósito original, aún es conocido y está bien documentado. Si biendd
es bueno para copiar grandes cantidades de datos, no es malo con pequeñas cantidades. Aquí tiene la ventaja de no hacer eco de la salida a la salida estándar también.sudo dd
lado de la otra, quiere hacer muy, muy seguro de que los argumentos que siguen son correctas (especialmente teniendo en cuenta su sintaxis no estándar). No lo llaman "destructor de discos" por nada ...El problema es que el comando se ejecuta bajo
sudo
, pero la redirección se ejecuta bajo su usuario. Esto lo hace el shell y hay muy poco que pueda hacer al respecto.Las formas habituales de evitar esto son:
Envuelva los comandos en un script que llame bajo sudo.
Si los comandos y / o el archivo de registro cambian, puede hacer que el script los tome como argumentos. Por ejemplo:
Llame a un shell y pase la línea de comando como parámetro con
-c
Esto es especialmente útil para los comandos compuestos únicos. Por ejemplo:
fuente
Otra variación más sobre el tema:
O por supuesto:
Tienen la (pequeña) ventaja de que no es necesario recordar a los argumentos
sudo
osh
/bash
fuente
Aclarando un poco sobre por qué es preferible la opción de tee
Suponiendo que tiene el permiso apropiado para ejecutar el comando que crea la salida, si canaliza la salida de su comando a tee, solo necesita elevar los privilegios de tee con sudo y tee directo para escribir (o agregar) al archivo en cuestión.
en el ejemplo dado en la pregunta que significaría:
para un par de ejemplos más prácticos:
En cada uno de estos ejemplos, está tomando la salida de un comando no privilegiado y escribiendo en un archivo que generalmente solo se puede escribir por raíz, que es el origen de su pregunta.
Es una buena idea hacerlo de esta manera porque el comando que genera la salida no se ejecuta con privilegios elevados. No parece importar aquí,
echo
pero cuando el comando de origen es un script en el que no confías por completo, es crucial.Tenga en cuenta que puede usar la opción -a para tee para agregar anexar (like
>>
) al archivo de destino en lugar de sobrescribirlo (like>
).fuente
Haga que sudo ejecute un shell, así:
fuente
La forma en que abordaría este problema es:
Si necesita escribir / reemplazar el archivo:
Si necesita agregar al archivo:
fuente
¿Qué tal escribir un guión?
Nombre de archivo: myscript
Luego use sudo para ejecutar el script:
fuente
Cada vez que tengo que hacer algo como esto, me convierto en root:
Probablemente no sea la mejor manera, pero funciona.
fuente
Lo haría de esta manera:
fuente
su
):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
No es mi intención vencer a un caballo muerto, pero hay demasiadas respuestas aquí que se usan
tee
, lo que significa que debe redirigirstdout
a/dev/null
menos que desee ver una copia en la pantalla.Una solución más simple es usarla
cat
así:Observe cómo la redirección se coloca entre comillas para que sea evaluada por un shell iniciado en
sudo
lugar de uno que lo ejecuta.fuente
sudo bash -c "ls -hal /root > /root/test.out"
. El uso de tee evita la necesidad de un caparazón, mientras que el gato no.Esto se basa en la respuesta que involucra
tee
. Para facilitar las cosas, escribí un pequeño script (lo llamosuwrite
) y lo puse/usr/local/bin/
con+x
permiso:Como se muestra en el USO en el código, todo lo que tiene que hacer es canalizar la salida a este script seguido del nombre de archivo deseado accesible por el superusuario y automáticamente le pedirá su contraseña si es necesario (ya que incluye
sudo
).Tenga en cuenta que dado que este es un contenedor simple para
tee
, también aceptará la-a
opción de tee para agregar, y también admite la escritura en múltiples archivos al mismo tiempo.También tiene una protección simplista contra la escritura en
/dev/
dispositivos, lo cual fue una preocupación mencionada en uno de los comentarios en esta página.fuente
¿Tal vez le han dado acceso a sudo solo a algunos programas / rutas? Entonces no hay forma de hacer lo que quieres. (a menos que lo piratee de alguna manera)
Si no es el caso, entonces quizás puedas escribir un script bash:
Presione ctrl+ d:
Espero que sea de ayuda.
fuente
fuente
sudo
todos modos,at
no es útil o necesario.sudo sh -c 'echo test >/tmp/test.out'
hace lo mismo de manera mucho más eficiente y elegante (pero aún sufre la falla de que probablemente esté ejecutando cosasroot
que no necesitan ese privilegio; por lo general, debe evitar los comandos privilegiados cuando pueda).