salida del programa de cola al archivo en Linux

9

Sé que podemos usar el siguiente formato para redirigir la salida de la pantalla a un archivo:

$ your_program > /tmp/output.txt

Sin embargo, cuando utilicé el siguiente comando, dice "-bash: /home/user/errors.txt: Permiso denegado"

sudo tail /var/log/apache2/error.log > ~/errors.txt

¿Puedo saber cómo funciona esta salida? El ~ / errors.txt no existe. ¿Necesito crear este archivo txt primero antes de usar el comando de redirección?

Xianlin
fuente
1
¿Qué pasa si escribes echo hi > ~/errors.txt? ¿Es /home/usersu directorio de inicio correcto (o bash de alguna manera se confundió acerca de dónde está su directorio de inicio)?
cjm
¿ userEl usuario que ejecuta el comando?
usuario desconocido
Sí, el usuario es el usuario que ejecuta el comando
Xianlin
Este es un comportamiento normal para sudo. sudoNo permite la redirección. demasiadas maneras para que las personas puedan usar eso para hacer cosas malas que no están incluidas en el sudoers.confarchivo. Como alternativa, puede ejecutar sudo bash -c "tail /var/log/apache2/error.log > ~/errors.txt"para raspar el final de errors.log al archivo en su directorio de inicio.
Tim Kennedy

Respuestas:

17

Detrás de la tubería, el sudo no funciona. No sé por qué no puedes escribir en tu casa, ¿tal vez el archivo pertenece a la raíz?

 sudo tail /var/log/apache2/error.log | sudo tee ~/errors.txt

Tal vez necesite un usuario diferente detrás de la tubería. Por supuesto, no necesita un archivo preexistente.

usuario desconocido
fuente
Sí, eso funcionó ...
Xianlin
En cuanto al problema de permisos, ¿tal vez $ HOME está montado en NFS con rootquash?
Ansgar Esztermann
$ HOME no está montado en NFS.
Xianlin
6

Cuando escribe sudo somecommand > ~/errors.txt, el shell que llama sudo(y se ejecuta como usted) es el que realiza la redirección y la apertura ~/errors.txt. Consulte Redirigir stdout a un archivo para el que no tiene permiso de escritura . Por lo general, el problema en ese caso es que desea que el root escriba en el archivo; vea la pregunta vinculada para saber cómo hacer esto.

Aquí, es extraño que no pueda escribir en un archivo en su directorio de inicio. Lo más probable es que previamente haya guardado parte de la salida como raíz /home/user/errors.txt, y ese archivo ahora existe y pertenece a la raíz. Elimine el archivo (puede hacerlo siempre que tenga permiso de escritura /home/user, y luego podrá crearlo como su usuario.

rm ~/errors.txt
sudo tail /var/log/apache2/error.log > ~/errors.txt

Si el archivo realmente no existe, entonces no tiene permiso de escritura en su directorio de inicio. Si bien es técnicamente posible, y de hecho ocasionalmente útil para algunos usuarios restringidos, es muy inusual.

Gilles 'SO- deja de ser malvado'
fuente
Intenté eliminar '/home/user/errors.txt' y utilicé el comando anterior. No funcionó, todavía me prohíbe escribir en el directorio de inicio. De todos modos, supongo que el enlace que proporcionó puede usar como mi solución. Es lo mismo que la primera respuesta en esta publicación. Sin embargo, ha dado una explicación detallada sobre la redirección de stdout a un archivo y se lo agradezco.
Xianlin