GNU/Linux >> Tutoriels Linux >  >> Linux

Examiner /dev/log

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.


Linux
  1. Comment Linux gère-t-il plusieurs séparateurs de chemins consécutifs (/home////nom d'utilisateur///fichier) ?

  2. Linux :Différence entre /dev/console , /dev/tty et /dev/tty0 ?

  3. Quelle est la portabilité de /dev/stdin, /dev/stdout et /dev/stderr ?

  4. Quand utiliser /dev/random contre /dev/urandom ?

  5. Différence entre /var/log/messages, /var/log/syslog et /var/log/kern.log ?

tty (/dev/tty ) vs pts (/dev/pts) sous Linux

Comment Linux utilise /dev/tty et /dev/tty0

Est-ce une erreur de lier /dev/random à /dev/urandom sous Linux ?

echo ou print /dev/stdin /dev/stdout /dev/stderr

Pourquoi < ou > sont-ils nécessaires pour utiliser /dev/tcp

Différences entre /dev/sda et /dev/sda1