Surveillez ce qui est envoyé à / dev / null?

19

Juste pour le plaisir:
existe-t-il un moyen de surveiller / capturer / vider tout ce qui est écrit /dev/null?

Sur Debian ou FreeBSD, si cela est important, toute autre solution spécifique au système d'exploitation est également la bienvenue.

Ali
la source
3
Possible, mais comme les réponses et les commentaires le décrivent, ce n'est / très / pas une bonne idée.
Shadur
2
@Shadur: Il peut y avoir de mauvaises solutions, mais cela ne rend pas l'idée inintéressante ou mauvaise.
jlliagre
1
En effet, je viens de trouver cette question parce que je réfléchissais à ce qu'une analyse du contenu de nombreux /dev/nulls capturés pourrait révéler. Je ne voudrais pas faire la recherche moi-même, mais j'aimerais lire les résultats. (Il y aurait très probablement des problèmes éthiques à "regarder à travers les ordures des gens" essentiellement, mais le concept est néanmoins intéressant.)
beporter

Réponses:

12

Faire /dev/nullune pipe nommée est probablement le moyen le plus simple. Soyez averti que certains programmes ( sshd, par exemple) agiront anormalement ou ne s'exécuteront pas lorsqu'ils découvriront qu'il ne s'agit pas d'un fichier spécial (ou qu'ils peuvent lire à partir de /dev/null, s'attendant à ce qu'il revienne EOF).

# Remove special file, create FIFO and read from it
rm /dev/null && mkfifo -m622 /dev/null && tail -f /dev/null
# Remove FIFO, recreate special file
rm /dev/null && mknod -m666 /dev/null c 1 3

Cela devrait fonctionner sous toutes les distributions Linux et tous les BSD majeurs.

Chris Down
la source
1
Une chose à noter est que si l' tailéchec, alors beaucoup de programmes peuvent échouer parce que le tampon du canal est plein.
Arcege
4
Les programmes qui lisent /dev/nullne vont pas aimer ça.
Gilles 'SO- arrête d'être méchant'
@Gilles - En effet, d'où ma note.
Chris Down
3
@Ali Oui. No magicest un principe directeur dans la philosophie UNIX.
phihag
4
Ahem /dev/null est magique, mknod /dev/null c 1 3c'est la formule magique pour l'invoquer. (Et vous avez besoin de super-pouvoirs pour ça…)
Stéphane Gimenez
6

J'ai découvert une fois à la dure que / dev / null ne avoir à être un fichier dev spécial. Il y a longtemps, le / dev / null sur un système Ultrix au travail a été supprimé, donc la prochaine fois qu'un programme a été redirigé vers / dev / null, il s'est avéré être un fichier normal plein de la sortie de ce programme. (Je pense que ce n'était `` pas un tel fichier ou répertoire '', ce qui signifiait que lorsque nous essayions de comprendre ce qui se passait, nous le ferions cat /dev/nullet on nous dirait ce no such file or directoryqui nous a déroutés.)

Donc, ma suggestion serait de le remplacer par un tuyau nommé, puis d'attacher un programme au tuyau qui le lirait et le surveillerait.

Paul Tomblin
la source
4
De nombreux programmes reposent également sur le fait de /dev/nulltoujours retourner 0 octet sur un read ( cat /dev/null > foo). Le fait d' /dev/nullavoir un fichier régulier avec du contenu briserait cette attente.
Arcege
1
Oui, c'est ainsi que nous l'avons découvert. Les programmes n'attendaient aucune entrée et en obtenaient des quantités, plus / dev / se remplissait.
Paul Tomblin
1

Je pense à une idée où / dev / null peut être un lien symbolique vers un descripteur de fichier mais avec un mécanisme d'ajout de code pour déterminer que l'opération est lue ou écrite, puis si elle est lue, elle devrait en fait être lue à partir de / dev / actualnull créée séparément avec mknod et s'il est en écriture, notez le programme appelant et essayez de vous connecter / compter pour analyser les programmes qui utilisent / dev / null pour l'écriture. Cela va coûter cher en termes de performances, je suppose cependant. Je suppose que ce n'est pas pratique car la plupart des programmes shell ou du code utilisent de toute façon la redirection. Peut être inotify pourrait être utilisé pour surveiller l'utilisation de / dev / null? ou réécrire le code du noyau qui gère les périphériques 1: 3, à nouveau compiler et réinstaller, expérimentable.

Nikhil Mulley
la source
2
Il y a encore quelques problèmes, j'ai essayé de faire quelque chose comme ça (pas dans le noyau, mais de manière transparente en permettant de lire à partir d'un autre fichier et en contrôlant à /dev/nullpartir d'un démon), et je me suis sshdtoujours plaint et ne démarre pas.
Chris Down
hmm..intéressant sur / dev / null contrôlant depuis un démon. Je pense que la plupart des programmes voudraient simplement utiliser / dev / null comme juste un autre fichier laissant l'importance et la sémantique de / dev / null au système.
Nikhil Mulley
Eh bien, sshd(au moins, comme emballé pour Debian Squeeze) se plaint sshd: cannot create /dev/nullsi c'est autre chose que l'implémentation la plus courante.
Chris Down