GNU/Linux >> Tutoriales Linux >  >> Linux

Examinando /dev/log

Estoy resumiendo los comentarios a una respuesta completa. Tenga en cuenta que @MarkPlotnick fue el primero en señalar la solución correcta.

Como puedes ver en ls -lL salida, el archivo apuntado por su enlace es un socket , no un archivo regular o una canalización.

~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log

Mire el primer carácter de la salida. Ese s significa que el archivo es un socket.

No puedes usar el mecanismo de redirección > de bash (o, AFIK, cualquier otro shell) para escribir en un socket porque el shell intentará abrir el archivo y open no admite enchufes. Ver hombre abierto para más detalles.

Tienes que usar un programa que se conecte a un enchufe. Ver man connect para más detalles.

Como ejemplo, puede usar netcat o socat (consulte ¿Cómo puedo comunicarme con un socket de dominio Unix a través del shell en Debian Squeeze?).

En aras de la exhaustividad, puede utilizar la redirección en las tuberías.

~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo

Mira el primer carácter del ls producción. Ese p significa que el archivo es una canalización.


Para agregar información adicional a la respuesta aceptada (correcta), puede ver hasta qué punto /dev/log es simplemente un socket UNIX escribiendo en él como tal:

[email protected]:~$ echo 'This is a test!!' | nc -u -U /dev/log 
[email protected]:~$ sudo tail -1 /var/log/messages
Sep  5 16:50:33 lmassa-dev journal: This is a test!!

En mi sistema, puede ver que el proceso journald está escuchando este socket:

[email protected]:~$ sudo lsof | grep '/dev/log'
systemd       1                 root   29u     unix 0xffff89cdf7dd3740       0t0       1445 /dev/log
systemd-j   564                 root    5u     unix 0xffff89cdf7dd3740       0t0       1445 /dev/log

Recibió mi mensaje e hizo lo suyo:(es decir, agregarlo al archivo /var/log/messages).

Tenga en cuenta que debido a que el protocolo syslog del que habla journald espera datagramas (piense en UDP), no transmisiones (piense en TCP), si simplemente intenta escribir en el socket directamente con nc verá un error en la llamada al sistema (y no aparecerá ningún registro).

Comparar:

[email protected]:~$ echo 'This is a test!!' | strace nc -u -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_DGRAM, 0)          = 4
connect(4, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = 0

[email protected]:~$ echo 'This is a test!!' | strace nc  -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_STREAM, 0)         = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = -1 EPROTOTYPE (Protocol wrong type for socket)

Tenga en cuenta que elidí algunas llamadas al sistema para mayor claridad. El punto importante aquí es que la primera llamada especificó SOCK_DGRAM, que es lo que espera el socket /dev/log (ya que así es como el socket /dev/log se creó originalmente), mientras que el segundo no, por lo que obtuvimos un error.


Linux
  1. Cómo generar una contraseña aleatoria en Linux usando /dev/random

  2. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  3. ¿Qué tan portátiles son /dev/stdin, /dev/stdout y /dev/stderr?

  4. ¿Cuándo usar /dev/random Vs /dev/urandom?

  5. Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

tty (/dev/tty) vs pts (/dev/pts) en Linux

¿Diferencia entre /var/log/messages, /var/log/syslog y /var/log/kern.log?

¿Cómo codificar en base64 /dev/random o /dev/urandom?

DD de /dev/zero a /dev/null... lo que realmente sucede

kernel:deshabilitar /dev/kmem y /dev/mem

¿Está mal vincular /dev/random a /dev/urandom en Linux?