GNU/Linux >> Znalost Linux >  >> Linux

Zkoumání /dev/log

Shrnuji komentáře do úplné odpovědi. Všimněte si, že @MarkPlotnick byl první, kdo ukázal na správné řešení.

Jak můžete vidět v ls -lL výstup, soubor, na který odkazujete, je zásuvka , jiný než běžný soubor nebo roura.

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

Podívejte se na první znak výstupu. To s znamená, že soubor je soket.

Nemůžete použít mechanismus přesměrování > z bash (nebo AFIK, jakýkoli jiný shell) k zápisu do soketu, protože se shell pokusí otevřít soubor a open nepodporuje zásuvky. Podrobnosti viz man open.

Musíte použít program, který se připojuje k zásuvce. Podrobnosti viz man connect.

Jako příklad můžete použít netcat nebo socat (viz Jak mohu komunikovat s unixovým doménovým socketem přes shell na Debian Squeeze?).

Pro úplnost můžete použít přesměrování na potrubí.

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

Podívejte se na první znak ls výstup. To p znamená, že soubor je roura.


Chcete-li k přijaté (správné) odpovědi přidat nějaké další informace, můžete vidět, do jaké míry /dev/log je jednoduše soket UNIX tím, že se do něj jako takový zapíše:

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

V mém systému můžete vidět, že proces journald naslouchá tomuto soketu:

[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

Dostal mou zprávu a udělal s ní svou věc:(tj. připojení k souboru /var/log/messages).

Všimněte si, že protože protokol syslog, kterým žurnáld mluví, očekává datagramy (předpokládejme UDP), nikoli streamy (předpokládejme TCP), pokud jednoduše zkusíte zapisovat do soketu přímo pomocí nc uvidíte chybu v systémovém volání (a nezobrazí se žádný protokol).

Porovnejte:

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

Poznámka:Pro přehlednost jsem vynechal některá systémová volání. Zde je důležité, že první volání specifikovalo SOCK_DGRAM, což je to, co soket /dev/log očekává (protože takto soket /dev/log byl původně vytvořen), zatímco druhý ne, takže jsme dostali chybu.


Linux
  1. Jak vygenerovat náhodné heslo v linuxu pomocí /dev/random

  2. Rozdíl mezi /var/log/messages, /var/log/syslog a /var/log/kern.log?

  3. Co jsou soubory /dev/zero a /dev/null v Linuxu

  1. Jak kódovat base64 /dev/random nebo /dev/urandom?

  2. Kdy mám použít /dev/shm/ a kdy /tmp/?

  3. DD z /dev/zero do /dev/null...co se vlastně stane

  1. Je špatné propojit /dev/random s /dev/urandom v Linuxu?

  2. Proč jsou < nebo > vyžadovány pro použití /dev/tcp

  3. Rozdíly mezi /dev/sda a /dev/sda1