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
-copció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 -sluego ejecute sus comandos:Use
sudo tee(si tiene que escapar mucho cuando usa la-copción):La redirección a
/dev/nulles necesaria para evitar que el tee salga a la pantalla. Para agregar en lugar de sobrescribir el archivo de salida (>>), usetee -aotee --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 ddes mejor que lossudo tee /root/file > /dev/nullejemplos anteriores!ddes el nombre del comando,of=/root/test.outes el argumento que indicaddcuáles son los archivos de salida.ofsignifica archivo de salida yddes una herramienta muy popular utilizada tanto en Linux como en OSX (principalmente para escribir imágenes en discos). Este es un buen truco seguro.ddes probablemente igualmente útil comoteeaquí. 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 bienddes 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 ddlado 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
-cEsto 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
sudoosh/bashfuente
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í,
echopero 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 redirigirstdouta/dev/nullmenos que desee ver una copia en la pantalla.Una solución más simple es usarla
catasí:Observe cómo la redirección se coloca entre comillas para que sea evaluada por un shell iniciado en
sudolugar 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+xpermiso: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-aopció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
sudotodos modos,atno 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 cosasrootque no necesitan ese privilegio; por lo general, debe evitar los comandos privilegiados cuando pueda).