Как я присоединяюсь к двум именованным каналам в единственный входной поток в Linux

Это для конкретного пользователя или всех пользователей?

Если для конкретного пользователя:
Если Вы переходите к пользователю от 'Пользователей Active Directory, и Компьютеры' переходят к там свойствам и затем 'вкладке "Общие" Exchange' и затем 'Ограничениям Доставки'. Принимают сообщения 'от аутентифицируемых пользователей, только' проверенных?

Если для всех пользователей:
Если Вы идете Свойства Виртуального сервера SMTP, хотя 'менеджер по Системе обмена' и щелчок, вкладка 'Access' и переходит к Аутентификации, 'Анонимный Доступ', Включил?

Тест от внешнего Используя Telnet:
Попробуйте к telnet к нему с внешней стороны где-нибудь:

telnet mailServerIp 25
elho
Mail From: Foo@foo.com
RCPT TO: emailThatIsNotWorking@myDomain.com
DATA
Foo
.
65
задан 1 August 2014 в 00:00
7 ответов

Лично, мой фаворит (требует удара и других вещей, которые являются стандартными на большинстве дистрибутивов Linux),

Детали могут во многом зависеть от того, что производили эти две вещи и как Вы хотите объединить их...

Содержание command1 и command2 друг после друга в выводе:

cat <(command1) <(command2) > outputfile

Или если обе команды производят альтернативные версии тех же данных, которые Вы хотите видеть рядом (я использовал это с snmpwalk; числа на одной стороне и MIB называют на другом):

paste <(command1) <(command2) > outputfile

Или если Вы хотите выдержать сравнение, вывод двух подобных команд (скажите что находка относительно двух различных каталогов),

diff <(command1) <(command2) > outputfile

Или если им заказывают какие-то выводы, объединяют их:

sort -m <(command1) <(command2) > outputfile

Или выполненный обе команды сразу (мог скремблировать вещи немного, хотя):

cat <(command1 & command2) > outputfile

<() оператор настраивает именованный канал (или/dev/fd) для каждой команды, передавая вывод по каналу той команды в именованный канал (или/dev/fd ссылка дескриптора файла) и передает имя командной строке. Существует эквивалент с> (). Вы могли сделать: command0 | tee >(command1) >(command2) >(command3) | command4 одновременно отправить вывод одной команды к 4 другим командам, например.

106
ответ дан 28 November 2019 в 19:31

Можно добавить два пара другому с cat, как шоу гориллы.

Можно также создать FIFO, направить вывод команд к который, затем читать из FIFO со что другая программа:

mkfifo ~/my_fifo
command1 > ~/my_fifo &
command2 > ~/my_fifo &
command3 < ~/my_fifo

Особенно полезный для программ, которые только запишут или считают файл или смешивание программ, которые только производят stdout/file с тем, который поддерживает только другой.

16
ответ дан 28 November 2019 в 19:31
(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output

/tmp/p1 и /tmp/p2 Ваши входные каналы, в то время как /tmp/output вывод.

9
ответ дан 28 November 2019 в 19:31

Будьте осторожны здесь; просто catting их закончит тем, что смешал результаты способами, которыми Вы не можете хотеть: например, если они - файлы журнала, Вы, вероятно, действительно не хотите строку от одного вставленного на полпути через строку от другого. Если это хорошо, то

хвост-f/tmp/p1/tmp/p2>/tmp/output

будет работать. Если это не хорошо, то Вы оказываетесь перед необходимостью, действительно находят что-то, что сделает буферизацию строки и только произведет полные строки. Системный журнал делает это, но я не уверен, что еще могло бы.

Править: optimalization для освободившего буфер чтения и именованных каналов:

рассматривая/tmp/p1,/tmp/p2,/tmp/p3 как именованные каналы, созданные "mkfifo/tmp/pN"

хвост-q-f/tmp/p1/tmp/p2 | awk '{печатает 0$> "/tmp/p3"; близко ("/tmp/p3"); сброс ();}' и

теперь этим путем, мы можем читать, Выходной именованный канал "/tmp/p3" освободил буфер:

хвост-f/tmp/p3

существует небольшая ошибка вида, необходимо "инициализировать" 1-й входной канал/tmp/p1:

повторите-n>/tmp/p1

для конца, будет принимать вход от 2-го канала/tmp/p2 сначала и не ожидать, пока что-то не прибывает в/tmp/p1., это не может иметь место, если Вы будете уверены, то/tmp/p1 получит вход сначала.

Также-q опция необходима для конца, не печатает мусора об именах файлов.

3
ответ дан 28 November 2019 в 19:31
  • 1
    более полезное будет: " хвост-q-f/tmp/p1/tmp/p2 | another_command" , поскольку это будет сделано линию за линией и с-q опцией, это не распечатает никакого другого мусора –  readyblue 22 October 2014 в 22:27
  • 2
    для освободившего буфер использования файла/именованного канала: tail -q -f /tmp/p1 /tmp/p2 | awk '{print [110] > "/tmp/p3"; close("/tmp/p3"); fflush();}' & теперь/tmp/p3 может быть даже именованным каналом, и можно считать его просто tail -f /tmp/p3 , все это , ОСВОБОДИЛ БУФЕР = линию за линией существует однако небольшая ошибка вида. 1-й файл/именованный канал должен быть инициализирован сначала в хвосте порядка, примет вывод от 2-го. таким образом, Вам будет нужно к echo -n > /tmp/p1 и, чем все будет работать гладко. –  readyblue 22 October 2014 в 23:47

Действительно классная команда, которую я использовал для этого, - это tpipe , вам может потребоваться скомпилировать, потому что она не так распространена. Он действительно хорош для того, чтобы делать именно то, о чем вы говорите, и он настолько чистый, что я обычно его устанавливаю. Страница руководства находится здесь http://linux.die.net/man/1/tpipe . Список для загрузки в настоящее время находится в этом архиве http://www.eurogaran.com/downloads/tpipe/ .

Он используется так:

## Reinject sub-pipeline stdout into standard output:
$ pipeline1 | tpipe "pipeline2" | pipeline3
3
ответ дан 28 November 2019 в 19:31

Я создал для этого специальную программу: fdlinecombine

Она читает несколько каналов (обычно программные выходные данные) и записывает их в стандартный вывод (вы также можете переопределить разделитель)

5
ответ дан 28 November 2019 в 19:31

Лучшая программа для этого - lmerge . В отличие от ответа Freihart, он ориентирован на линию, поэтому результат двух команд не будет сбивать друг друга. В отличие от других решений, он справедливо объединяет ввод, поэтому никакая команда не может доминировать над выводом. Например:

$ lmerge <(yes foo) <(yes bar) | head -n 4

Дает вывод:

foo
bar
foo
bar
1
ответ дан 28 November 2019 в 19:31

Теги

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