LINUX.ORG.RU

Вывод слушающего netcat в переменную

 , ,


0

2

Возникла проблема с сохранением вывода netcat в переменную для дальнейшей обработки, собственно:

простая подстановка для теста (работает)

data=`ps ax | grep top`;
echo $data;

в указанный порт по UDP сыпятся строковые данные, почему-то не могу сохранить вывод netcat в переменную:

while true;
do
    data=`nc -vul 27050`;
    # тут мы будем делать всякие замены и т.д. с текстом в $data
    echo $data > /var/log/nc.log
done;
в $data ничего нет, в файле, соответственно, тоже.

если не пытаться сделать вывод в переменную - сыпется в консоль как и задумано

while true;
do
    nc -vul 27050;
done;

where i miss ?

тебе чего надо? и в консоль и в файл? юзай tee
надо только в файл? юзай перенаправление сразу.

тут мы будем делать всякие замены

nc | sed .. | awk .. | black_magic | even_more_magic > /var/log/nc.log

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

aol ★★★★★
()
aol@hp:~$ echo qwe > /var/log/wtf.log
bash: /var/log/wtf.log: Permission denied

ты ведь свою поделку от рута пускаешь, чтобы в вар-лог писать? ;)

aol ★★★★★
()
Ответ на: комментарий от aol

Перенаправление в файл идет ТОЛЬКО ДЛЯ ТЕСТА, в боевых условиях это будет кидаться POST-ом через curl на заданный url. В данный момент я пытаюсь понять почему у меня ничего нет в $data. Промежуточная задача простая - вывод netcat'а в переменную.

Хочется избежать однострочного скрипта с множеством | ради читаемости, да и не селен я в баше.

TheRaven
() автор топика
Ответ на: комментарий от aol

а может быть у меня уже есть файл с правами на нужного юзера ? ^_^

TheRaven
() автор топика

А nc у вас вобще завершает работу? Пока nc не завершился, в дальше скрипт не пойдёт.

mky ★★★★★
()
Ответ на: комментарий от mky

Вот буквально только что заметил что netcat отдает данные при завершении работы, соответственно решением является запуск с нулевым таймаутом

nc -w 0 -ul 27050

Всем спасибо.

TheRaven
() автор топика
Ответ на: комментарий от TheRaven

При запуске с нулевым таймаутом в вашем цикле «while» будут моменты времени, когда сокет никто не слушает, и в эти моменты времени будут потери пакетов. Советую запустить скрипт на вывод nc:

nc -ul 27050 | while read A ; do 
  echo $A
  # Много других команд
done 
mky ★★★★★
()
Ответ на: комментарий от mky

С таким способом что-то не то - первое пришедшее сообщение есть, далее вместо сообщений выводятся переводы строки.

TheRaven
() автор топика
Ответ на: комментарий от mky

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

TheRaven
() автор топика
Ответ на: комментарий от TheRaven

С другого компьютера или с этого же отправляйте udp-пакеты с помощью nc (запускаете, вводите с клавиатуры и завершаете nc по Ctrl-C) и смотрите что получается.

nc -u 127.0.0.1 27050

У меня выводится всё, что я отправляю с помощью nc. Если у вас не так, надо разбиратся с nc. Если на тестовый ввод с клавиатуры всё работет, а реальные пакеты выводятся неправильно, значит в пакетах какие-то неправильные байты: 0x00, 0xff или может какие ещё, которые не переваривает bash. Можно записать вывод nc в файл и посмотреть в hex, какие там есть байты.

mky ★★★★★
()
Ответ на: комментарий от mky

При передаче с nc на nc построчно выводится.

Записал мои данные в файл, все строки кроме первой начинаются с некого NUL-символа (как его обозвал Notepad++)

Вид текстом Вид в HEX

Видимо вот этот «00» ему и не нравится в начале строки. Это как-то лечится налету ? Скажем то же sed или <подставить вариант> ... гуглю в этом направлении

TheRaven
() автор топика
Ответ на: комментарий от mky
nc -ul 27050 | while read line; do echo $line | tr -d '\000'; done

к сожалению результата не дает - первое сообщение есть, дальше переводы строки ...

так же пробовалось

sed "s/\x00//g"
sed "s/[^0-9a-zA-Z ]//g"
с тем же результатом :(

TheRaven
() автор топика
Ответ на: комментарий от TheRaven

tr надо ставить между nc и while read. Pipe прозрачен для всех байт, ему всё равно что передавать. А bash считает '\000' символом конца строки, и получив этот символ на вход команды read ничего не считывает в переменную line.

mky ★★★★★
()
Ответ на: комментарий от mky

Большое спасибо за уделенное время и решение моей проблемы.

TheRaven
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.