Я пытаюсь получить данные, которые я получаю через соединение netcat, со сценарием, который будет отправлять каждую строку на другой сервер с помощью команды curl post.
Вот где я.
Это работает: nc -lk 9272 > test.log
Каждая полученная строка, как и ожидалось, заносится в журнал.
Это не работает:
nc -lk 9272 | ./senddata.sh
Ожидайте, что он отправит строки в этот сценарий:
#! /bin/bash
echo "Received Line!"
line=$1
cart=${line:0:7}
type=${line:7:4}
title=${line:14:28}
curl -d "cart=$cart&type=$type&title=$title" -X POST http://server/update
И это не ./senddata.sh 9272
senddata.sh
#!/bin/bash
echo "Started listening on port $1 ..."
while read line
do
if [ "$line" == 'exit' ]; then
echo "Received 'exit'"
break
else
echo "Received Line!"
cart=${line:0:7}
type=${line:7:4}
title=${line:14:28}
curl -d "cart=$cart&type=$type&title=$title" -X POST http://server/update
fi
done < <((echo "Welcome.") | nc -kl $1)
echo "Good bye"
Конечная цель - получить данные, а затем отправить их в свое приложение через сообщение.
Попробуйте использовать второй сценарий с первым вариантом (но удалите перенаправление в конце while
петля).
Вот образец, который я только что протестировал:
root@kube-01-01:~# cat test.sh
#!/bin/bash
while read line
do
echo "Received Line!"
echo $line
done
echo "Good bye"
root@kube-01-01:~# nc -l 8090 | ./test.sh
Received Line!
test
Received Line!
hello there
Good bye
В вашем первом скрипте вы получали данные на стандартный ввод (stdin) через канал. Однако вы пытались прочитать его, используя $1
(который относится к первому аргументу командной строки, переданному сценарию).