Schrift
[thread]4460[/thread]

Port nach Skriptende offenlassen: Idee gesucht



<< >> 10 Einträge, 1 Seite
RalphFFM
 2007-04-13 14:22
#37497 #37497
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

sobald ein Skript sich beendet, werden m.W. alle durch das Skript geöffneten Ports geschlossen. (glaube ich)

Hat jemand eine Idee wie man ein Szenario ähnlich folgendem erreichen kann:
- Das erste Skript öffnet einen Port (zu einem Mailserver).
- Erstes Skript beendet sich.
- Zweites Skript startet und nutzt den durch das erste Skript geöffneten Port, und setzt die begonnene Kommunikation zum Mailserver fort.
- Zweites Skript beendet sich.

Im voraus Danke fürs Lesen und Denken ... :-]

PS: Eine Linux-Umgebung angenommen.
Strat
 2007-04-17 02:53
#37498 #37498
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn, dann kann's vielleicht exec (aber ich glaub's nicht, und selbst wenn, weiss ich nicht, wie man aus dem zweiten programm an den port drankommt...).

vielleicht einen kleinen proxydaemon schreiben, der die verbindung offen haelt und an den beide programme ihre anfragen stellen?\n\n

<!--EDIT|Strat|1176764045-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Ronnie
 2007-04-17 08:15
#37499 #37499
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Könnte mir auch nur vorstellen das man netcat im listener-mode/tunneling-mode dazwischenhängt?!\n\n

<!--EDIT|Ronnie|1176783417-->
Gast Gast
 2007-04-17 11:04
#37500 #37500
Guten Morgen Strat und Ronnie,

@Strat: werde ich baldmöglichst ausprobieren. Hmm, mal überlegen wie eine Übergabe von Daten stattfinden könnte.

@Ronnie: werde ich versuchen nachzuvollziehen wie Du das meinst. In der Vergangenheit hat sich leider schon herausgestellt, daß nicht alle Möglichkeiten die netcat bietet unter Ubuntu auch möglich sind. Beispielsweise von einem netcat-Prozeß an einem Port x zu horchen, und die (Request-)Antwort über denselben Port mittels eines anderen netcat-Prozesses zurückzusenden, ist unter Ubuntu nicht möglich, wird aus Sicherheitsgründen leider verhindert.
betterworld
 2007-04-17 11:43
#37501 #37501
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=RalphFFM,13.04.2007, 12:22]sobald ein Skript sich beendet, werden m.W. alle durch das Skript geöffneten Ports geschlossen. (glaube ich)[/quote]
Das ist in dieser Form nicht ganz richtig. Wenn das Skript sich beendet (also ueber exit oder ein Signal, fuer exec siehe weiter unten), werden all seine Dateideskriptoren geschlossen. Wenn ein Dateideskriptor zu einem Socket gehoert und kein anderer Prozess einen Dateideskriptor fuer dieses Socket hat, wird das Socket geschlossen. Es kann aus mehreren Gruenden mehr als ein Prozess ein Socket geoeffnet haben:
1) Durch Forking hat der Kindprozess dieselben Dateideskriptoren wie der Elternprozess
2) Prozesse koennen Dateideskriptoren ueber Unix-Domain-Sockets an andere Prozesse schicken. (Ich habe dazu hier im Forum auch mal irgendwann ein Beispiel gepostet, das koennte ich bei Bedarf mal raussuchen.) (Update: Hier ist es)

[quote=Strat,17.04.2007, 00:53]wenn, dann kann's vielleicht exec (aber ich glaub's nicht, und selbst wenn, weiss ich nicht, wie man aus dem zweiten programm an den port drankommt...)[/quote]

Das ist in der Tat auch moeglich und gar nicht so schwer zu realisieren. Hier habe ich zwei Scripte; das erste oeffnet eine Datei und fuehrt dann das zweite Script ueber exec aus, welches dann aus der Datei eine Zeile liest.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
# script.pl
use strict;
use warnings;
use Fcntl;

open my $f, '<', '/etc/inittab' or die $!;

# Hiermit wird festgelegt, dass der Dateideskriptor von $f beim exec nicht geschlossen wird.
fcntl($f, F_SETFD, (~FD_CLOEXEC) & (fcntl($f, F_GETFD, 0))) or die $!;

exec('./script2.pl', fileno($f)) or die $!;
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
# script2.pl
use strict;
use warnings;

my ($fileno) = @ARGV or die;

# Hiermit wird aus der Nummer des Dateideskriptors, die der Einfachheit halber ueber ARGV uebergeben wurde, wieder ein Perl-Dateihandle gemacht.
open my $f, '<&', $fileno or die $!;

my $line = <$f>;
die $! unless defined $line;
print "first line: $line";


(Disclaimer: Das bezog sich alles auf Un*x-Systeme, nix Windows)
Edit: Ich hatte aus Versehen zweimal das gleiche Script gepastet.\n\n

<!--EDIT|betterworld|1176799379-->
murphy
 2007-04-17 12:02
#37502 #37502
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Wenn ein Prozess einen offenen Dateideskriptor von einem anderen Prozess übernehmen soll, aber keine Eltern-Kind-Relation zwischen den Prozessen besteht, gibt es auch noch die Möglichkeit, den Deskriptor über einen Unix-Domain-Socket zu verschicken.\n\n

<!--EDIT|betterworld|1176800354-->
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2007-04-17 12:06
#37503 #37503
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=RalphFFM,13.04.2007, 12:22]- Das erste Skript öffnet einen Port (zu einem Mailserver).
- Erstes Skript beendet sich.
- Zweites Skript startet und nutzt den durch das erste Skript geöffneten Port, und setzt die begonnene Kommunikation zum Mailserver fort.
- Zweites Skript beendet sich.[/quote]
Waere es fuer Dich auch machbar, ein "Hauptskript" zu haben, welches zuerst den Port oeffnet und dann hintereinander das "Erste Skript" und das "Zweite Skript" ausfuehrt? Das wuerde dann ueber system() funktionieren. Bekanntlich funktioniert system ueber fork und exec, und wie ich oben geschrieben habe, ist es moeglich, bei fork (automatisch) und exec (durch Resetten von FD_CLOEXEC) jeweils die Dateideskriptoren beizubehalten.\n\n

<!--EDIT|betterworld|1176797277-->
Gast Gast
 2007-04-17 12:40
#37504 #37504
Grundsätzlich möglich, befürche daß dann ein anderes Problem auftaucht. Muß ich aber zuhause ausprobieren.
Für die Erläuterung von betterworld betreffend Socket und Dateidescriptor bin ich sehr dankbar. Ich lese wirklich nicht wenig, aber das habe ich so bisher noch nirgends finden können.
betterworld
 2007-04-17 13:33
#37505 #37505
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=murphy,17.04.2007, 10:02]Wenn ein Prozess einen offenen Dateideskriptor von einem anderen Prozess übernehmen soll, aber keine Eltern-Kind-Relation zwischen den Prozessen besteht, gibt es auch noch die Möglichkeit, den Deskriptor über einen Unix-Domain-Socket zu verschicken.[/quote]
Ich habe oben uebrigens noch den Link eingefuegt zu einem Beispiel dazu. Wer den Link nicht gesehen hat:
Linux-Monitor\n\n

<!--EDIT|betterworld|1176802592-->
Strat
 2007-04-18 01:29
#37506 #37506
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
@betterworld: danke fuer die ausfuehrliche Erklaerung. Jetzt bin ich wieder schlauer.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 10 Einträge, 1 Seite



View all threads created 2007-04-13 14:22.