Следите за тем, что отправляется в / dev / null?

19

Просто для удовольствия:
есть ли способ контролировать / захватывать / сбрасывать то, на что пишется /dev/null?

В Debian или FreeBSD, если это имеет значение, также приветствуются любые другие решения для конкретных ОС.

Али
источник
3
Возможно, но, как показывают ответы и комментарии, это / очень / много не очень хорошая идея.
Шадур
2
@Shadur: могут быть плохие решения, но это не делает идею неинтересной или плохой.
Jlliagre
1
На самом деле, я только что нашел этот вопрос, потому что я думал о том, что может дать анализ содержимого из многих захваченных /dev/nulls. Я бы не хотел проводить исследование сам, но я бы хотел прочитать результаты. (Скорее всего, существуют некоторые этические проблемы, связанные с «просмотром мусора людей», но концепция, тем не менее, интересна.)
beporter

Ответы:

12

Создание /dev/nullименованного канала, вероятно, самый простой способ. Имейте в виду, что некоторые программы ( sshdнапример) будут работать неправильно или не будут выполняться, когда обнаружат, что это не специальный файл (или они могут прочитать из него /dev/null, ожидая его возврата 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

Это должно работать во всех дистрибутивах Linux и всех основных BSD.

Крис Даун
источник
1
Следует отметить, что в случае tailсбоя может произойти сбой многих программ, поскольку буфер канала заполнен.
Arcege
4
Программы, которые читают из этого /dev/null, не понравится.
Жиль "ТАК - перестань быть злым"
@ Жиль - Действительно, отсюда и моя заметка.
Крис Даун
3
@ Али Да. No magicявляется руководящим принципом в философии UNIX.
phihag
4
Гм /dev/null это магия, mknod /dev/null c 1 3это волшебная формула, чтобы вызвать его. (И для этого вам нужны суперсилы ...)
Стефан Гименес
6

Однажды я обнаружил, что / dev / null не должен быть специальным файлом dev. Давным-давно / dev / null на работающей системе Ultrix был удален, поэтому в следующий раз, когда программа перенаправилась на / dev / null, она оказалась обычным файлом, полным выходных данных этой программы. (Я думаю, что это был «не такой файл или каталог», что означало, что, когда мы пытались выяснить, что происходит, нам приходилось делать cat /dev/nullи говорить, no such file or directoryчто чертовски смущало нас.)

Поэтому я предлагаю заменить его на именованный канал, а затем присоединить к каналу программу, которая будет читать и отслеживать ее.

Пол Томблин
источник
4
Многие программы также полагаются на то, что /dev/nullвсегда возвращают 0 байтов в read ( cat /dev/null > foo). Наличие /dev/nullобычного файла с содержимым нарушило бы это ожидание.
Arcege
1
Да, вот как мы это обнаружили. Программы не ожидали ввода и получали кучу информации, плюс / dev / заполнялся.
Пол Томблин
1

Я думаю о идее, где / dev / null может быть символической ссылкой на дескриптор файла, но с механизмом добавления кода для определения операции чтения или записи, а затем, если она читается, она должна фактически считываться из / dev / actualnull, созданного отдельно с mknod, и если он записан, запишите вызывающую программу и попытайтесь выполнить запись / подсчет для анализа программ, использующих / dev / null для записи. Я полагаю, что это будет стоить дорого с точки зрения производительности. Я предполагаю, что это не практично, так как большинство программ оболочки или кода все равно используют перенаправление. Может быть, inotify может быть использован для мониторинга использования / dev / null? или переписать код ядра, который обрабатывает устройства 1: 3, снова скомпилировать и переустановить, экспериментально.

Никхил Мулли
источник
2
Все еще есть некоторые проблемы, я пытался сделать что-то подобное (не в ядре, а прозрачно, позволяя читать из другого файла и управлять /dev/nullиз демона), и sshdвсе равно жаловался и не запускался.
Крис Даун
хм .. интересно на / dev / null управление от демона. Я думаю, что большинство программ просто хотели бы использовать / dev / null в качестве другого файла, оставляя важность и семантику / dev / null для системы.
Nikhil Mulley
Ну, sshd(по крайней мере, в пакете для Debian Squeeze) жалуется, sshd: cannot create /dev/nullесли это что-то кроме самой распространенной реализации.
Крис Даун