GNU/Linux >> Linux Esercitazione >  >> Linux

Esaminando /dev/log

Sto riassumendo i commenti per una risposta completa. Nota che @MarkPlotnick è stato il primo a indicare la soluzione giusta.

Come puoi vedere in ls -lL output, il file puntato dal tuo collegamento è un socket , non un file normale o una pipe.

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

Guarda il primo carattere dell'output. Quel s significa che il file è un socket.

Non puoi utilizzare il meccanismo di reindirizzamento > di bash (o, AFIK, qualsiasi altra shell) per scrivere in un socket perché la shell proverà ad aprirsi il file e open non supporta le prese. Vedi man open per i dettagli.

Devi usare un programma che si connette a un socket. Vedi man connect per i dettagli.

Ad esempio, puoi usare netcat o socat (vedi Come posso comunicare con un socket di dominio Unix tramite la shell su Debian Squeeze?).

Per completezza, puoi usare il reindirizzamento sulle pipe.

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

Guarda il primo carattere del ls produzione. Quel p significa che il file è una pipe.


Per aggiungere alcune informazioni aggiuntive alla risposta accettata (corretta), puoi vedere fino a che punto /dev/log è semplicemente un socket UNIX scrivendovi come tale:

[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!!

Sul mio sistema, puoi vedere che il processo journald sta ascoltando questo 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

Ha ricevuto il mio messaggio e ha fatto il suo dovere:(ad es. aggiungendo al file /var/log/messages).

Si noti che poiché il protocollo syslog di cui parla journald si aspetta datagrammi (si pensi a UDP), non flussi (si pensi a TCP), se si prova semplicemente a scrivere nel socket direttamente con nc vedrai un errore nella chiamata di sistema (e nessun registro verrà visualizzato).

Confronta:

[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)

Nota che ho eliminato alcune chiamate di sistema per chiarezza. Il punto importante qui è che la prima chiamata ha specificato SOCK_DGRAM, che è ciò che si aspetta il socket /dev/log (poiché questo è il modo in cui il socket /dev/log è stato creato originariamente), mentre il secondo no, quindi abbiamo ricevuto un errore.


Linux
  1. Come generare una password casuale in Linux usando /dev/random

  2. In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

  3. Linux:differenza tra /dev/console , /dev/tty e /dev/tty0?

  4. Quanto sono portatili /dev/stdin, /dev/stdout e /dev/stderr?

  5. Differenza tra /var/log/messages, /var/log/syslog e /var/log/kern.log?

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

Quando usare /dev/random vs /dev/urandom?

Come mappare il dispositivo /dev/sdX e /dev/mapper/mpathY dal dispositivo /dev/dm-Z

Cosa sono i file /dev/zero e /dev/null in Linux

Come codificare in base64 /dev/random o /dev/urandom?

Differenze tra /dev/sda e /dev/sda1