Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: Naka в Aug 25, 2012, 13:03



Титла: Програма, която да привързва stdin/stdout към tcp връзка
Публикувано от: Naka в Aug 25, 2012, 13:03
Имам програма която работи постоянно и нищо друго не прави освен да чете stdin, да го обработва и да го изкарва обратно на  stdout.

Данните са текстови и са разделени с \n. тук за простота наричам програмата 'user_lines_process'. Тя е доволно сложно нещо, накрая има много опции, които заради тестването постоянно променям.

Има ли някакъв стандарен тоол (нещо подобно на TCP Wrapper) с който да може да стартира user_lines_process, да захване нейният стандартен вход и изход и да ги пренасочи към tcp сокет.

например нещо такова:
demonize -port 8080 -host localhost "user_lines_process"

целта ми е да мога отдалечено да тествам работа на user_lines_process например така:

echo 'some text to test' | nc localhost 8080

четох това
http://www.lainoox.com/bash-socket-programming/
http://shudder.daemonette.org/source/BashNP-Guide.txt

exec 3<> /dev/tcp/127.0.0.1/8080
user_lines_process 1>&3 <&3

Обаче така не става, защото порта 8080 трябва да е вече отворен. Това си е само писане на shell-а към сокет.

TCP Wrapper-ите от рода на tcpd също не стават, защото долкото разбирам те само изпълняват един път програмата, когато дойде конекция и след това я забравят. А при мен user_lines_process работи непрекънато. Не е направена да обработи еднин ред и след това да излезе.


това
nc -k -l 8080 | user_lines_process

работи, но само в едната посока  :'(- слуша на порт 8080, но само за stdin - и не може да изпрати изхода от stout обратно на 8080.

Този проблем като гледам е доволно просто нещо и се надявах да има някаква програма с която да мога набързо да закърпя нещата - докато тествам и променям опциите. Като всичко е готово ще бутна user_lines_process в някой скрит, който да прави всичко това, но засега не ми се пише още скрипт, щото имам още много неизвестни. :'(


Титла: Re: Програма, която да привързва stdin/stdout към tcp връзка
Публикувано от: niakoi в Aug 25, 2012, 15:04
мисля че добре си се насочил с нц,
http://ubuntuforums.org/showthread.php?t=828870
виж т.2

поздрави
нас


Титла: Re: Програма, която да привързва stdin/stdout към tcp връзка
Публикувано от: tdonev в Aug 28, 2012, 22:09
.. изтрито от автора ..


Титла: Re: Програма, която да привързва stdin/stdout към tcp връзка
Публикувано от: Nedko Arnaudov в Aug 29, 2012, 15:40
ssh няма ли да ти свърши работа? TCP е, но криптирано.


Титла: Re: Програма, която да привързва stdin/stdout към tcp връзка
Публикувано от: geroy в Aug 30, 2012, 10:26
Също така tcpserver от пакета ucspi-tcp на DJB


Титла: Re: Програма, която да привързва stdin/stdout към tcp връзка
Публикувано от: Naka в Aug 31, 2012, 21:08
Мерси nc наистина върши работата.....  [_]3 Само че откъде да се сетя като моята версия на nc нямаше нито -c нито -е опция. :'(

То се оказва, че в света щъкат няколко версии на nc.
инсталирах си варянт на nc (който обаче се казва ncat) от сайта на nmap
http://nmap.org/ncat/
http://nmap.org/book/ncat-man-options-summary.html


програмката я стартирам така:
ncat --allow localhost,xxx.xxx.xxx.xxx -l 8181 --keep-open --max-conns 1 --sh-exec "user_lines_process "

а пък на отдалечения компютър пиша това:
nc server_ip 8181

това не е точно което исках, защото се оказа че nc/ncat рабoтят по следният начин:
при стартирането на командата:
ncat ...... -l 8181 --sh-exec "user_lines_process"

user_lines_process не се стартира. ncat изпълнява скрипта само когато се инициализира връзка отдалечено. В действителност скрипта се стартира даже и ако отдалечено се пусне nmap да сканира за отворени портове и премине и през 8181.

докато е отворена връзката скрипта е жив и мога да се тествам отдалечено безкрайно време ред след ред. обаче ако прекъсна връзката на клиентският компютър ncat спира скрипта.(например след натискане Ctrl-C)
След нова конекция всичко започва пак наново. Както и да е това засега върши идеална работа.

Исках въпросната програма да се стартира един път в началото и да не може да се спре независимо какво се изпраща отдалечено и независимо дали е прекъсната връзката. След време ще го напиша в конзолен PHP скрипт. Имам един пример написан на perl, но въобще не ми се занимава с perl.

Някой знае ли коя е еквивалентната функция на PHP на това:
http://perldoc.perl.org/IPC/Open2.html