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.