2015-11-25 7 views
2

Я пытаюсь записать поток netcat в локальный файл, но хочу также аннотировать каждую поточную запись в реальном времени с помощью некоторых метаданных (например, исходного IP-соединения), поскольку Я буду работать с несколькими потоками, которые будут записываться в один и тот же файл.Запись потока Netcat в файл с дополнительным текстом

Например, следующая (команда Баш) работает отлично:

nc 192.168.0.1 443 >> result.txt & echo -n "| Source: 192.168.0.1 | " >> result.txt 

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

Source: 192.168.0.1 | !* Connected! 
X 
Y 
Z 

Я хочу, чтобы письменные результаты выглядеть следующим образом:

Source: 192.168.0.1 | !* Connected! 
Source: 192.168.0.1 | X 
Source: 192.168.0.1 | Y 
Source: 192.168.0.1 | Z 
Source: 192.168.0.2 | A  #<--Written From different netcat stream 

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

ответ

1

попробовать СЕПГ (s Tream ред itor):

nc 192.168.0.1 443 | sed -u 's/^/Source: 192.168.0.1 | /g' >> results.txt 

это должно заменить начало каждой строки ^ с текстом Source: 192.168.0.1 | я проверил его с tail -f some.file | sed -u 's/^/Source: 192.168.0.1 | /g'>t.txt и получил:

Source: 192.168.0.1 | line one 
Source: 192.168.0.1 | line two 
Source: 192.168.0.1 | ... 
Source: 192.168.0.1 | line n 

nb: флаг -u должен предотвращать использование буферизации sed. Этот флаг поддерживается только в Linux, а не в Mac OSX.

+0

Спасибо. Это почти необходимое решение. Когда я запускаю команду nc 192.168.0.1 443 | sed 's/^/Источник: 192.168.0.1 |/g 'Я вижу результаты точно так, как хочу их (записано в stdout). Однако, когда я нажимаю на >> results.txt, он не пишет или не добавляет к файлу. Я играл с перенаправлением вывода, но до сих пор не повезло. Я буду отмечать это как лучший ответ, как только выясню эту последнюю часть. – Karimi

+0

проблема вызвана буферизацией. по умолчанию каждая строка отображается немедленно, если вывод идет на терминал, но если вывод идет в файл, более крупные блоки (4-64 КБ) буферизуются, и файл записывается только после заполнения буфера. См. [Этот вопрос] (http://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe), может быть, один из ответов там поможет вам. – Thawn

+1

В Linux я нашел решение, просто добавьте флаг '-u' в команду sed. Надеюсь, это поможет. – Thawn