Parameter bei einem Remshell uebergeben
Holger
- perl
Hallo,
ich fuehre ein rmsh auf die Datei holger.pl aus.
Diese Datei sourct nur ein bestimmtes Profil ein, um DB-Connection-informationen zu bekommen. danach soll auf ein anderes Skript verwiesen werden, das dann die eigentliche DB-connection uebernimmt.
also:
(einbinden des Profils:) . /opt/(...)/group.profile
(redirect:) /opt/(...)/bp_data_status_app.pl
Mein Problem ist nur, dass der "redirect-skript" dynamisch bestimmt werden muss, da holger.pl von mehreren Dateien aufgerufen wird, die alle ein anderes remsh machen, aber die gleiche DB-Connection benoetigen.
Wie kann ich im remsh -Command Parameter uebergeben?
So koennte man doch den Parameter fuer das redirect-skript an holger.pl uebergeben.
Ich hoffe, das war verstaendlich ausgedrueckt.
Danke im voraus,
Holger
Wie fuehre ich dieses Unix-Commando aus:
/opt/script.pl
wenn ich dazu noch parameter an das Skript uebergeben moechte?
in HTML sieht das ja so aus: script.pl?var=irgendwas
aber in einem unix-Commando?
Gruss,
Holger
Wie kann ich in einem Skript das Profil
/opt/(...)/lib/buypower_group.profile
einbinden?
Halihallo Holger
Wie kann ich in einem Skript das Profil
/opt/(...)/lib/buypower_group.profile
einbinden?
Gegenfragen:
a) Wie ist die Datei syntaktisch aufgebaut (Struktur, Inhaltstyp)
b) Wie willst du die Daten vorliegen haben? - Wie willst du auf die Daten darin
zugreifen?
Viele Grüsse
Philipp
Mal ein paar Details zur Struktur:
es gibt auf dem Server a ein skript, das header, inhalt und footer darstellt.
Der inhalt besteht aus einem Skript auf dem Server b, das mittels remsh aufgerufen wird. in diesem Skript wird eine db-Connection aufgebaut.
leider sind die db-infos (dbname, username, und pw) nur auf server b in einem package und dort als $ENV eingebunden.
Diese env definieren sich im Profil fuer den benutzer, der im remsh angegeben wird.
Rufe ich nur das Inhaltsskript auf server b auf, klappt die db-abfrage.
rufe ich das komplette Skript auf server a (und somit das inhaltsskript ueber remsh auf), werden diese db-variablen nicht erkannt.
ich dachte mir, das liegt am remsh-befehl, da ueber ihn keine profile-dateien bekannt sind.
Halihallo Holger
es gibt auf dem Server a ein skript, das header, inhalt und footer darstellt.
Der inhalt besteht aus einem Skript auf dem Server b, das mittels remsh aufgerufen wird. in diesem Skript wird eine db-Connection aufgebaut.
leider sind die db-infos (dbname, username, und pw) nur auf server b in einem package und dort als $ENV eingebunden.
Diese env definieren sich im Profil fuer den benutzer, der im remsh angegeben wird.
Um Himmels willen, aber was machst du da? - Das hört sich nach Katastrophe an. Du greifst
bei jedem Request auf einen fremden Server über remsh zu? - Gibt es da keine andere
Möglichkeit?
rufe ich das komplette Skript auf server a (und somit das inhaltsskript ueber remsh auf), werden diese db-variablen nicht erkannt.
Natürlich, diese musst du ja dem remote-Prozess mitteilen. Bei remsh geht das, wie ich
gelesen habe, über STDIN (pipe zu remsh); die Ausgabe des remote-prozess kommt über
STDOUT rein. Die Kommunikation zwischen diesen beiden Prozessen läuft also über die
Dateihandler (mit remsh als "Kommunikationsinterface"), nicht über Parameter. Wäre es
ggf. eine Möglichkeit über LWP::Simple die Daten zu holen? - Oder über ein Socket?
ich dachte mir, das liegt am remsh-befehl, da ueber ihn keine profile-dateien bekannt sind.
Keine Ahnung, ich habe mit remsh noch nie gearbeitet :-)
Dein Vorhaben scheint mir jedoch höchst katastrophal. Ich schlage vor, dass du nochmals
ganz genau darüber nachdenkst, wie man es anders lösen kann (ggf. ziehe in Betracht ganz
von einem zweiten Rechner abzusehen).
Viele Grüsse
Philipp
Das problem ist, dass ich diese architektur uebernehmen muss. Da sie schon so vorliegt
der remsh-befehl greift auf holger.pl zu, das sich ebenfalls auf serever b befindet.
In holger.pl steht nur folgendes:
./opt/(...)/group.profile
/opt/(...)/dbconnectionscript.pl
anstelle dass ich den remsh wie vorher auf das dbconnectionscript.pl ausfuehre, habe ich hier eine Zwischenstufe, die nur das gewuenschte profil einbindet und danach weiterleitet.
Klappt soweit ganz gut.
Da ich aber nun mehrmals von anderen Skripten den remsh-befehl ausfuehren muss, und dieser auch verschiedene redirect-scripte haben muss, ist diese loesung nicht die endgueltig richtige, da sie nur statisch weiterleitet.
Wie kann ich nun den redirect-pfad dynamisch vom aufrufer des remsh uebergeben?
ueber sockets? oder ueber den stdin? Damit kenne ich mich nicht so gut aus, da muss wohl die doku zu rate gezogen werden.
Hallo,
Wie kann ich nun den redirect-pfad dynamisch vom aufrufer des remsh uebergeben? [...] da muss wohl die doku zu rate gezogen werden.
Das mit der Doku ist immer ein guter Ansatz. Es hat sich in der Vergangenheit bewährt, daß das vor einem Posting erfolgt;-)
Wenn sich remsh so verhält wie sich die meisten gleich gelagerten Tools verhalten[1], kannst Du dem scrip noch Parameter mit übergeben, genau so wie Du es bei einem lokalen Aufruf machen kannst.
Im Perlscript kannst Du die Parameter dann über @ARGV auslesen.
Grüße
Klaus
[1] der Blick in die Doku sollte Gewißheit bringen *g*
Halihallo Holger
Da ich aber nun mehrmals von anderen Skripten den remsh-befehl ausfuehren muss, und dieser auch verschiedene redirect-scripte haben muss, ist diese loesung nicht die endgueltig richtige, da sie nur statisch weiterleitet.
Was meinst du mit "Weiterleitung"? - Weiterleitung ist mir in diesem Kontext unbekannt.
Wie kann ich nun den redirect-pfad dynamisch vom aufrufer des remsh uebergeben?
Eben: Über remsh kann man mit dem Remote-Prozess über die Filehandles STDIN/STDOUT
kommunizieren.
Informiere dich diesbezüglich unter:
perldoc perlipc
perldoc IPC::Open2
perldoc IPC::Open3
perldoc -f open # in Verbindung mit Pipes
ueber sockets? oder ueber den stdin? Damit kenne ich mich nicht so gut aus, da muss wohl die doku zu rate gezogen werden.
Ja. Wenn du remsh verwendest, brauchst du keine Sockets mehr, denn diese funktionieren
einfach ausgedrückt gleich (du würdest das Problem nur noch komplexer machen, als es
eh schon ist, was ich bereits bemängelt habe).
Viele Grüsse
Philipp
Halihallo Holger
Wie fuehre ich dieses Unix-Commando aus:
/opt/script.pl
z.B. über:
system('/opt/script.pl')
wenn ich dazu noch parameter an das Skript uebergeben moechte?
system('/opt/script.pl','paramtername1=parameterwert1','paramname2=paramval2');
aber in einem unix-Commando?
s. oben.
Zugriff über @ARGV
Und warum lädst du die Konfiguration nicht in dem Script, wo sie gebraucht wird? - Und
wie willst du eine DB-Connection übergeben?
Dir sind Module bekannt?
BTW: Was ist eine ramshell?
Viele Grüsse
Philipp