¿Dónde se supone que los programas de espacio de usuario guarden sus registros?


23

Estoy escribiendo un script que quiero ejecutar sin privilegios. Quiero que los errores que encuentra el script se registren en algún archivo de registro. No tengo privilegios para escribir uno /var/log. Y no quiero tener uno en mi directorio personal.

¿Existe una ubicación donde los scripts de espacio de usuario pueden registrar información de tiempo de ejecución? ¿Cuál es la mejor práctica para tener la información de registro de mi script /var/logsin crear ningún problema de seguridad potencial? Dudo en establecer uid / gid en el script.

Respuestas:


8

No puede escribir en / var / log como un usuario normal, pero el demonio syslog lo hará por usted si lo solicita. Si desea registrar mensajes en los registros estándar del sistema (por ejemplo /var/log/syslog), la utilidad 4.4BSD loggerpodría estar disponible en su sistema. Está instalado por defecto en Debian, y está en el bsdutilspaquete de derivados de Debian.

Obtendrá la ventaja de cualquier herramienta de supervisión, mantenimiento y rotación de registros preexistente, con la desventaja de necesitar privilegios para leer los registros del sistema y de mezclar los mensajes de su script con los mensajes de otros programas.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

Hay varias opciones de configuración disponibles; se puede leer más en man logger.


¿hay enlaces de idioma para esta utilidad? Preferiría no generar subprocesos para cada línea de stdout en la aplicación.
ThorSummoner

@ThorSummoner: Como dice la respuesta de Gilles, sysloges una rutina de biblioteca C, y C ++ puede llamar a cualquier C usando extern "C". Otros lenguajes a menudo proporcionan enlaces genéricos a cualquier cosa C, o enlaces a cosas específicas, pero depende del lenguaje.
dave_thompson_085

12

Si usted, como usuario ordinario, decide ejecutar un programa, el lugar natural para sus registros está en su directorio de inicio. Su directorio de inicio está destinado a que almacene todos sus archivos, ya sean registros de un programa que ejecute o cualquier otra cosa.

Si el programa se ejecuta como parte del sistema, ejecutándose como un usuario del sistema típicamente dedicado, entonces el lugar natural para sus registros está en /var/log. Cree un subdirectorio /var/log/myappy dele los permisos adecuados para que su aplicación pueda escribir allí.

Si es relevante y su sistema operativo lo permite, marque el archivo de registro solo como anexo. Solo root puede hacer esto. Esto tiene la ventaja de que si su aplicación se ve comprometida, no podrá borrar registros anteriores, lo que puede ser muy útil para el análisis forense del compromiso. Necesitará la intervención de root para rotar el registro: de chownmodo que la aplicación, renameel archivo de registro, ya no pueda abrir el archivo de registro, cree un nuevo archivo de solo agregado con la propiedad apropiada, luego notifique a la aplicación que abra el nuevo archivo vacío .

Puede hacer que cualquier aplicación ingrese a los registros del sistema llamando logger(1) o syslog(3).


4

En general, para un demonio, el archivo de registro se crea para rootentonces, los permisos se modifican para que el usuario no privilegiado pueda escribir en él. logrotateluego se configura para preservar los permisos durante la rotación.

Si se trata de un comando, no de un demonio, inicie sesión en /tmp(preferiblemente usando mktemp) e informe al usuario a STDOUTdónde fue el registro.


Buena idea. Tengo unas pocas líneas en mi ~ / .profile que comprueba si dropbox demon se está ejecutando y lo inicia si no es así. Estaba considerando agregar un &para evitar retrasar el mensaje, pero al iniciar Dropbox escribe en la consola. Actualmente estoy redirigiendo su salida a /dev/null, pero me gustaría tener alguna forma de depurar si Dropbox no se inicia.
Lord Loh

1
Echa un vistazo daemonize.
bahamat

Solo para saber, "los permisos se modifican para que el usuario no privilegiado pueda escribirle". ¿Se hace esto simplemente con chmod 666? ¿o tengo que agregar un usuario a un grupo o algo así?
Lord Loh

Mejor bajo / var / tmp, / tmp no está garantizado para sobrevivir a un arranque.
vonbrand

@ LordLoh .: Sí, con chmod. Por lo general, 0644o 0664y la propiedad del usuario / grupo también cambia a la del demonio que se espera que le escriba.
bahamat

3

Tengo la impresión de que se espera que los programas de espacio de usuario descarten los registros de forma predeterminada. He visto varios programas volcar registros donde quieran, y nunca es particularmente bienvenido en mis sistemas; tiende a acumularse en un lugar que nunca se nota a menos que / hasta que se vuelva enorme.

Preferiría si hubiera un lugar definido para ellos, estoy jugando en mi sistema tratando de encontrar un lugar estable para ellos.

Mi primera idea fue usar /var/run/user/$UID/log , pero descubrí que en mi sistema, eso es un montaje TMPFS, no lo suficientemente grande o realmente bueno para usar con registros.

Crea un lugar para ellos

Como no entiendo / var / run / user lo suficientemente bien como para integrarme con él, he elegido emularlo a mano, para el usuario 1000.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

Recomendaría seguir el FHS / var / log spc para la estructura dentro de esta carpeta, pero la forma libre de especificaciones, por lo que no hay mucho que cumplir.

Logrotate Config

No hay rotación de registro existente en este directorio proporcionado por su sistema, le recomiendo crear uno para su sistema:

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

A continuación se muestra mi publicación anterior / var / run / user / 1000 / log, no puedo recomendarla a menos que realmente sepa lo que está haciendo (¡y si lo hace, dígame cómo hacerlo también!)

tal vez de la siguiente manera, pero lo inventé porque tenía sentido para mí.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

Integrar con / var / log / user / 1000:

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.