Ich fasse die Kommentare zu einer vollständigen Antwort zusammen. Beachten Sie, dass @MarkPlotnick als erster auf die richtige Lösung hingewiesen hat.
Wie Sie in ls -lL
sehen können Ausgabe ist die Datei, auf die Ihr Link zeigt, ein Socket , keine normale Datei oder Pipe.
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
Sehen Sie sich das erste Zeichen der Ausgabe an. Diese s
bedeutet, dass die Datei ein Socket ist.
Sie können den Umleitungsmechanismus >
nicht verwenden von bash
(oder AFIK, jede andere Shell), um in einen Socket zu schreiben, da die Shell versuchen wird, sich zu öffnen die Datei und open
unterstützt keine Sockets. Siehe Man Open für Details.
Sie müssen ein Programm verwenden, das eine Verbindung zu einem Socket herstellt. Einzelheiten finden Sie unter man connect.
Als Beispiel können Sie netcat
verwenden oder socat
(siehe Wie kann ich mit einem Unix-Domain-Socket über die Shell auf Debian Squeeze kommunizieren?).
Der Vollständigkeit halber können Sie die Umleitung auf Pipes verwenden.
~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo
Sehen Sie sich das erste Zeichen von ls
an Ausgang. Diese p
bedeutet, dass die Datei eine Pipe ist.
Um der akzeptierten (richtigen) Antwort einige zusätzliche Informationen hinzuzufügen, können Sie sehen, inwieweit /dev/log
ist einfach ein UNIX-Socket, indem Sie ihn als solchen schreiben:
[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!!
Auf meinem System können Sie sehen, dass der Journald-Prozess auf diesen Socket lauscht:
[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
Es hat meine Nachricht bekommen und hat sein Ding damit gemacht:(d. h. Anhängen an die /var/log/messages-Datei).
Beachten Sie, dass, weil das Syslog-Protokoll, das Journald spricht, Datagramme erwartet (denken Sie an UDP), keine Streams (denken Sie an TCP), wenn Sie einfach versuchen, direkt mit nc
in den Socket zu schreiben Sie sehen einen Fehler im Systemaufruf (und es wird kein Protokoll angezeigt).
Vergleichen Sie:
[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)
Beachten Sie, dass ich der Übersichtlichkeit halber einige Systemaufrufe weggelassen habe. Der wichtige Punkt hier ist, dass der erste Aufruf das SOCK_DGRAM spezifiziert hat, was der Socket /dev/log erwartet (da so der Socket /dev/log
wurde ursprünglich erstellt), während die zweite nicht erstellt wurde, sodass wir eine Fehlermeldung erhalten haben.