GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Untersuchen von /dev/log

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.


Linux
  1. So generieren Sie ein zufälliges Passwort unter Linux mit /dev/random

  2. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  3. Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

  4. Wann sollte /dev/random vs. /dev/urandom verwendet werden?

  5. Unterschied zwischen /var/log/messages, /var/log/syslog und /var/log/kern.log?

tty (/dev/tty ) vs. pts (/dev/pts) unter Linux

Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0?

So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

Was sind /dev/zero- und /dev/null-Dateien in Linux

Kernel:/dev/kmem und /dev/mem deaktivieren

Warum sind < oder > erforderlich, um /dev/tcp