Печать в STDOUT по сравнению с прямой записью в выходной файл

Во-первых, если у вас есть несколько IP-адресов в /etc/resolv.conf, только первый будет использоваться до тех пор, пока он не перестанет отвечать, затем будет использоваться только второй, и только для этого конкретного запроса (начнется следующий. снова с первым ). Обратите внимание, что не удалось ответить — это не то же самое, что ответить ошибкой.

Итак, некоторые рекомендации:

  1. Не смешивайте внешние (, такие как общедоступные преобразователи DNS ), с внутренними; в большинстве случаев это не имеет смысла, поскольку основано на ложных убеждениях, что если внешний ответит сообщением, что домен не найден, то внутренний будет использоваться для дальнейшего запроса (это неверно, как объяснено в преамбуле ); напротив, это может привести к утечке внутренней конфиденциальной информации внешним организациям
  2. Не ставьте вслепую 8.8.8.8или фактически любой другой публичный открытый резольвер; сначала подумайте об этом. Вы действительно думали о последствиях (того, что вы передаете все свои данные Google в этом случае или любой другой организации; Вы довольны этим? )а вы взвешивали плюсы и минусы? Что побудило вас не использовать рекурсивные серверы имен вашего интернет-провайдера и/или не устанавливать некоторые из них локально на вашем компьютере или в вашей сети? Могут быть веские причины для использования общедоступных преобразователей DNS, но всегда лучше немного подумать об этом, прежде чем просто указать некоторые цифры
  3. Существует множество общедоступных распознавателей DNS, и меня особенно беспокоит то, что в 99% случаев люди думают только о Google. Почему бы не использовать вместо этого 9.9.9.9, или 1.1.1.1, или 80.80.80.80, или любой из перечисленных в https://www.publicdns.xyz/, например (, без какой-либо гарантии, что этот список правильный или актуальный )? Конечно, это ничего не меняет выше предыдущего пункта, что бы вы ни выбрали, это должно произойти только после того, как вы спросите, зачем вам это нужно.

Пожалуйста, взгляните на этот другой мой ответ :https://superuser.com/a/1318861/693623, который касается понятия доверия,и какие функции вы, возможно, захотите иметь (Минимизация QNAME, конфиденциальность данных, проверка DNSSEC и т. д.)

0
12.04.2021, 09:53
2 ответа

Несколько практических примеров:


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


Однако, с другой стороны, вариант -o <output-file-name>обычно предпочтительнее, если приложению скорее требуется поиск по выходным данным.

Конечно, вы также можете lseek(2)заменить стандартный вывод (, если он действительно доступен для поиска ), но это обычно неожиданное поведение.

Естественно, то же самое верно и для ввода.


Для перенаправления из/в файл требуется оболочка. Специальный аргумент option позволяет не требовать оболочки.


Перенаправление из/в файл позволяет легко обмениваться положением этого файла (, если он доступен для поиска ), или соединением этого канала/сокета между несколькими приложениями, что может быть полезным в сценариях оболочки, например, в:

{
    echo hello world
    head -c 10
    seq 10 | awk '{print "amazing text-manipulation of", $0}'
    dd bs=1024 count=1 seek=32
    echo farewell
} < /dev/random > recipient-file

Полагаться только на -o recipient-fileвариант (или-i /dev/random)не позволит (так просто ).


В некоторых случаях противоположное вышеприведенному также может иметь место :опция -o <output-file-name>позволяет сделать вывод этого приложения не загрязняющим стандартный вывод при совместном использовании его с другими приложениями, например, в:

strace -o prog.strace output-producer > prog.output

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

unwanted-consumer -i /dev/null desired-consumer

Если полагаться только на stdin/stdout, потребуется дополнительный уровень оболочки, как в:

strace > prog.strace sh -c 'output-producer > prog.output'

или для стандартного ввода:

unwanted-consumer 3<&0 < /dev/null sh -c 'desired-consumer <&3'

Помимо компактности/чистоты команды, а также того, что вообще не требуется оболочка, вызов оболочки включает в себя несколько другую среду, и вам может потребоваться настроить ее для output-producerили desired-consumer, что увеличивает общую нагрузку.

2
28.04.2021, 22:53

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

С другой стороны, если выходные данные обычно двоичные или очень большие (по сравнению с входными данными ), то может иметь смысл запрашивать имя файла по умолчанию и отказываться от печати на терминале, если только явно спросил.

Для первой группы рассмотрим grep, sort, cutи другие, которые одинаково хорошо работают как часть конвейера, питающего другую программу, и как выдающие выходные данные, читаемые непосредственно пользователем. Почти все знают, что они печатают на стандартный вывод и привыкли перенаправлять вывод в файл, если захотят.

Для второго варианта рассмотрим, например. convertот ImageMagick, который может конвертировать и обрабатывать файлы изображений. Он принимает имена входных и выходных файлов в командной строке. Здесь файл изображения реже используется как часть конвейера, и на практике никто не хочет, чтобы JPEG или PNG выгружались на их терминал, поэтому здесь имеет смысл сделать это таким образом.

При использовании аргументов имени файла может быть хорошей идеей разрешить -обозначать stdin или stdout, при условии, что вы задокументируете это. Это довольно распространенный обычай, избавляющий пользователя от необходимости использовать вместо него что-то вроде /dev/stdin. (И это может привести к сбою в некоторых системах.)

Делать то, что делают другие инструменты, хорошо тем, что оставляет меньше места для неожиданностей. Если, конечно, ваш вариант использования не отличается настолько, что копирование других не имеет смысла.

2
28.04.2021, 22:53

Теги

Похожие вопросы