Je résume les commentaires à une réponse complète. Notez que @MarkPlotnick a été le premier à pointer vers la bonne solution.
Comme vous pouvez le voir dans ls -lL
sortie, le fichier pointé par votre lien est un socket , non un fichier régulier ou un tuyau.
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Regardez le premier caractère de la sortie. Ce s
signifie que le fichier est un socket.
Vous ne pouvez pas utiliser le mécanisme de redirection >
sur bash
(ou, AFIK, tout autre shell) pour écrire dans un socket car le shell essaiera de ouvrir le fichier et open
ne prend pas en charge les sockets. Voir l'homme ouvert pour plus de détails.
Vous devez utiliser un programme qui se connecte à une prise. Voir man connect pour plus de détails.
Par exemple, vous pouvez utiliser netcat
ou socat
(voir Comment puis-je communiquer avec un socket de domaine Unix via le shell sur Debian Squeeze ?).
Par souci d'exhaustivité, vous pouvez utiliser la redirection sur les pipes.
~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo
Regardez le premier caractère du ls
production. Ce p
signifie que le fichier est un tube.
Pour ajouter des informations supplémentaires à la réponse acceptée (correcte), vous pouvez voir dans quelle mesure /dev/log
est simplement un socket UNIX en y écrivant comme tel :
[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!!
Sur mon système, vous pouvez voir que le processus journald écoute ce 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
Il a reçu mon message et a fait son travail :(c'est-à-dire en ajoutant au fichier /var/log/messages).
Notez que parce que le protocole syslog que journald parle attend des datagrammes (pensez à UDP), pas des flux (pensez à TCP), si vous essayez simplement d'écrire directement dans le socket avec nc
vous verrez une erreur dans l'appel système (et aucun journal ne s'affichera).
Comparez :
[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)
Notez que j'ai élidé certains appels système pour plus de clarté. Le point important ici est que le premier appel a spécifié le SOCK_DGRAM, ce qui correspond à ce que le socket /dev/log attend (puisque c'est ainsi que le socket /dev/log
a été créé à l'origine), alors que le second ne l'a pas été, nous avons donc obtenu une erreur.