xinetd, bash und stdin. Problem.
Hallo zusammen, bastele gerade ein kleines Bash Skript, dass auf einem tcp Port auf Verbindungen lauschen soll. Dazu setze ich xinetd ein, der soll den Eingang der Verbindung ja auf stdin an das Serverskript übergeben. xinetd config: service bashtest { port = 9766 socket_type = stream protocol = tcp wait = no instances = 1 flags = IPv4 user = nobody server = /tmp/bashtest.sh disable = no } bashtest.sh: #!/bin/bash cat /dev/stdin Wenn ich jetzt zb mit echo TEST|netcat localhost 9766 etwas an den Port sende, dann bekomme ich cat: /dev/stdin: No such device or address als Ausgabe. Irgendwie kann der xinetd nichts an stdin des Skripts senden. Hat dazu jemand eine Idee warum? An den Rechten liegt es nicht, auch wenn ich das Skript anstatt als nobody als root laufen lasse, selbes Ergebnis.... danke Tschau Stefan -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Stefan König wrote:
bastele gerade ein kleines Bash Skript, dass auf einem tcp Port auf Verbindungen lauschen soll. Dazu setze ich xinetd ein, der soll den Eingang der Verbindung ja auf stdin an das Serverskript übergeben.
IMO NEIN (s.u.)
xinetd config:
service bashtest { port = 9766 socket_type = stream protocol = tcp wait = no instances = 1 flags = IPv4 user = nobody server = /tmp/bashtest.sh disable = no }
bashtest.sh:
#!/bin/bash cat /dev/stdin
(Vorab: Ich bin KEIN Programmierer; daher ist die AW evtl nicht ganz richtig) Ich kenne das so wie Du das beschreibst NICHT. Der xinetd lauscht auf einem Port; wenn auf dem Port etwas passiert startet er das konfigurierte Programm. ALLES was danach auf dem Port passiert ist Sache des jeweiligen Programms. Das xinetd lenkt NICHT den Strom von Port x auf stdin des Prozesses. D.h. dein Programm muss sich selber um das Handling der Daten auf dem Port kümmern. Andreas -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Tue, 06 Sep 2011, Kyek, Andreas, VF-DE schrieb:
Stefan König wrote:
bastele gerade ein kleines Bash Skript, dass auf einem tcp Port auf Verbindungen lauschen soll. Dazu setze ich xinetd ein, der soll den Eingang der Verbindung ja auf stdin an das Serverskript übergeben.
IMO NEIN (s.u.)
xinetd config:
service bashtest { port = 9766 [..] #!/bin/bash cat /dev/stdin
(Vorab: Ich bin KEIN Programmierer; daher ist die AW evtl nicht ganz richtig)
Ich kenne das so wie Du das beschreibst NICHT.
Der xinetd lauscht auf einem Port; wenn auf dem Port etwas passiert startet er das konfigurierte Programm. ALLES was danach auf dem Port passiert ist Sache des jeweiligen Programms. Das xinetd lenkt NICHT den Strom von Port x auf stdin des Prozesses. D.h. dein Programm muss sich selber um das Handling der Daten auf dem Port kümmern.
Korrekt. Stefan, guck dir mal das Paket perl-Net-Server an. Da wäre das ungefähr das, was in der manpage steht: ==== #!/usr/bin/perl -w -T package MyPackage; use base qw(Net::Server); sub process_request { my $self = shift; while (<STDIN>) { s/\r?\n$//; print "You said '$_'\r\n"; # basic echo last if /quit/i; } } MyPackage->run(port => 9766); ==== BTW: kurz mal ausprobiert, mit der bash klappt's auch nicht, wenn man aus /dev/tcp/localhost/9766 liest. Und hier hat auch der xinetd gemeckert, also log im Auge haben, wenn man an sowas bastelt. HTH, -dnh -- Kurz gefasst: /etc/crontab ist IMHO so nützlich wie eine Laus in einem Raumanzug - es juckt, aber Du kannst Dich nicht kratzen, es sei denn, Du bist Gott auf Deinem System. Und dann weisst Du noch nicht mal, ob Du anstelle der Laus Deine Nase amputiert hast. -- Jan Trippler in suse-linux -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
David Haller schrieb:
Hallo,
Am Tue, 06 Sep 2011, Kyek, Andreas, VF-DE schrieb:
Stefan König wrote:
bastele gerade ein kleines Bash Skript, dass auf einem tcp Port auf Verbindungen lauschen soll. Dazu setze ich xinetd ein, der soll den Eingang der Verbindung ja auf stdin an das Serverskript übergeben.
IMO NEIN (s.u.)
xinetd config:
service bashtest { port = 9766
[..]
#!/bin/bash cat /dev/stdin
(Vorab: Ich bin KEIN Programmierer; daher ist die AW evtl nicht ganz richtig)
Ich kenne das so wie Du das beschreibst NICHT.
Der xinetd lauscht auf einem Port; wenn auf dem Port etwas passiert startet er das konfigurierte Programm. ALLES was danach auf dem Port passiert ist Sache des jeweiligen Programms. Das xinetd lenkt NICHT den Strom von Port x auf stdin des Prozesses. D.h. dein Programm muss sich selber um das Handling der Daten auf dem Port kümmern.
Korrekt. Stefan, guck dir mal das Paket perl-Net-Server an. Da wäre das ungefähr das, was in der manpage steht:
==== #!/usr/bin/perl -w -T package MyPackage; use base qw(Net::Server); sub process_request { my $self = shift; while (<STDIN>) { s/\r?\n$//; print "You said '$_'\r\n"; # basic echo last if /quit/i; } } MyPackage->run(port => 9766); ====
BTW: kurz mal ausprobiert, mit der bash klappt's auch nicht, wenn man aus /dev/tcp/localhost/9766 liest. Und hier hat auch der xinetd gemeckert, also log im Auge haben, wenn man an sowas bastelt.
HTH, -dnh
Oh hm, danke für den Hinweis ,da haben mich die diversen Google Ergebnisse in die falsche Richtung gelenkt. Dummerweise habe ich von Perl wenig bis gar keine Ahnung.... Ich fürchte, dann muss ich mich mit netcat quälen! Grüße Stefan -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
On Tuesday, 06 September 2011 09:55:15 Stefan König wrote:
bastele gerade ein kleines Bash Skript, dass auf einem tcp Port auf Verbindungen lauschen soll. Dazu setze ich xinetd ein, der soll den Eingang der Verbindung ja auf stdin an das Serverskript übergeben.
Das folgende funktioniert bei mir unter 11.4: # cat bashtest service bashtest { type = UNLISTED port = 9766 socket_type = stream protocol = tcp wait = no instances = 1 flags = IPv4 user = nobody server = /tmp/bashtest.sh disable = no } # cat /tmp/bashtest.sh #!/bin/bash while read; do echo $$: $REPLY [ "$REPLY" = quit ] && exit 0 done # socat readline tcp:localhost:9766 huhu 21294: huhu fritz 21294: fritz franz 21294: franz quit 21294: quit oder auch das hier: # bash -c 'exec 4<>/dev/tcp/localhost/9766; echo >&4 huhu; read -u 4; echo $REPLY;' 21628: huhu Torsten Förtsch -- Need professional modperl support? Hire me! (http://foertsch.name) Like fantasy? http://kabatinte.net -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (4)
-
David Haller
-
Kyek, Andreas, VF-DE
-
Stefan König
-
Torsten Förtsch