Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12233[/thread]

Variable über Web steuern

Leser: 2


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
MarioH
 2008-07-24 00:27
#112550 #112550
User since
2008-07-24
11 Artikel
BenutzerIn
[default_avatar]
Hallo Perl-Mitstreiter,

dies ist meine erste Anfrage in diesem Forum. Leider hat mir die Suche im Forum keine Antwort auf folgende Problemstellung gebracht. Evt. gibt es aber noch Hoffnung fuer mich! ;-)

Ich schiebe mit folgendem CGI-Script (liegt auf dem Web-Server und ist per visudo ausführbar auf Linux-Server) ein lokales Script auf einem entfernten Web-Server im Intranet an:

#!/usr/bin/perl
system("sudo /etc/script.sh");


Dies funktioniert einwandfrei. Gern würde ich jedoch auch ein anderes Script anschieben, welches bei lokaler Ausfuehrung auf dem Server eine Eingabe einer Variablen erwartet:

#/bin/bash
...
read variable
...


Habe ich eine Möglichkeit, diese Abfrage bzw. Eingabe der Variablen auch über das Web abzusetzten? Dies würde mir wirklich sehr helfen!!! Da die Variable fuer das Script wirklich wechselt, muss ich diese Eingabe immer ausführen. Gern wuerde ich das Script per entfertem Browser mit Eingabe der Variablen anschieben.

Ich bitte um Unterstützung!

Vielen Dank!

Mario

//ModEdit GwenDragon: Threadtitel korrigiert
betterworld
 2008-07-24 00:42
#112551 #112551
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Also Deine Frage ist, ob Du ein externes Programm starten kannst und ihm Eingabe liefern kannst?

Das geht so:
Code: (dl )
1
2
3
4
5
6
open my $pipe, '|-', 'programm' or die $!;
{
local $SIG{PIPE} = 'IGNORE';
print $pipe "stuff\n" or die $!;
}
close $pipe or die $?;


Hast Du sudo eigentlich so konfiguriert, dass das Script ohne Passwort ausgefuehrt werden kann? Da musst Du bei Shell-Scripten sehr aufpassen, dass Du Dich nicht auf $PATH verlässt...
MarioH
 2008-07-24 01:17
#112553 #112553
User since
2008-07-24
11 Artikel
BenutzerIn
[default_avatar]
Hallo betterworld,

das Skript läuft durch Eintrag per visudo ohne Kennwortabfrage. Allerdings verstehe ich Deinen Tipp mangels Perl-Kenntnis nicht. Muss ich diesen Code in das Perl-CGI-Skript, oder in das lokale Skript eintragen?

Für ein fertiges Beispielskript wäre ich sehr dankbar.

Schon jetzt herzlichen Dank an alle Herfer!

Mario
betterworld
 2008-07-24 01:27
#112554 #112554
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
MarioH+2008-07-23 23:17:23--
Muss ich diesen Code in das Perl-CGI-Skript, oder in das lokale Skript eintragen?

In das Perl-Script.

Siehe auch perldoc -f open sowie perldoc -f close

Ferner Wiki:Externe Programme im Wiki, allerdings geht es da in die andere Richtung, also Ausgabe des Programms lesen.

Dieses ganze Konstrukt mit den geschweiften Klammern und dem local ist übrigens nur dazu da, um SIGPIPE zu ignorieren, welches ansonsten zum kommentarlosen Absturz des Perl-Programmes führen kann, wenn das externe Programm sich frühzeitig beendet. Hmm, mir fällt gerade ein: Man sollte das close vermutlich auch noch innerhalb der geschweiften Klammern machen.
MarioH
 2008-07-24 01:57
#112555 #112555
User since
2008-07-24
11 Artikel
BenutzerIn
[default_avatar]
@ betterworld,

kannst Du mir (als Ausnahme für einen Neuling) das komplette CGI-Skript für die Definition der Variable VAR1 benennen, wenn diese in der lokalen Datei mit read VAR1 ausgelesen wird!

Unendlich Dank! ;-)

Mario
MarioH
 2008-07-30 12:59
#112891 #112891
User since
2008-07-24
11 Artikel
BenutzerIn
[default_avatar]
Hallo Mitstreiter,

leider habe ich nun auch nach längerem Probieren noch keinen Erfolg gehabt; brauche bitte also noch immer Eure Unterstützung:

Per

Code: (dl )
1
2
#!/usr/bin/perl
system("sudo /etc/script.sh");


kann ich noch immer jedes lokales Script auf dem Webserver des Intranets anschieben (ja, alles mit visudo angepasst).

Im eigentlichen Bashscript (script.sh) möchte ich aber eine Variable ausführen

Beispiel - nuetuerlich will ich spaeter nicht nur Leerdateien mit Wunschnamen erzeugen
Code: (dl )
1
2
3
4
#/bin/bash

read variable
touch ${variable}.txt


Wie kann ich über den entfernten Browser diese Variable übergeben? Über ein fertiges und funktionierendes Beispiel würde ich mich sehr freuen!

MarioH
nepos
 2008-07-30 13:33
#112895 #112895
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hast du betterworlds Tipp zu open() statt system() denn gelesen?
Die Variable musst du natürlich erstmal auslesen. Dazu empfiehlt sich dann das Modul CPAN:CGI:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw/:standard/;

# Neues CGI-Objekt, mit dem du Parameter auslesen kanns, HTTP-Header und HTML 
# ausgeben kannst
my $query = CGI->new();

# Header ausgeben
print $query->header();

my $variable_value = $query->param('variable');

# ACHTUNG: Nachdem du den Wert der Variable in ein Shell-Skript weitergibst,
# solltest du unbedingt prüfen, dass da kein Mist drinsteht. Da ich nicht weiss,
# welche Werte denn in dieser Variablen stehen dürfen, kann ich dir dafür keinen
# Check vorgeben!!!

open my $pipe, '|-', 'programm' or die $!;
{
    local $SIG{PIPE} = 'IGNORE';
    print $pipe "$variable" or die $!;
}
close $pipe or die $?;


Das ganze ist nicht getestet, sollte aber im groben passen...
MarioH
 2008-07-30 14:21
#112896 #112896
User since
2008-07-24
11 Artikel
BenutzerIn
[default_avatar]
Vielen Dank Nepos,

ich habe nun folgendes Script:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/perl
use strict;
use warnings;
use CGI qw/:standard/;

# Neues CGI-Objekt, mit dem du Parameter auslesen kanns, HTTP-Header und HTML
# ausgeben kannst
my $query = CGI->new();

# Header ausgeben
print $query->header();

my $variable_value = $query->param('variable');

# ACHTUNG: Nachdem du den Wert der Variable in ein Shell-Skript weitergibst,
# solltest du unbedingt prüfen, dass da kein Mist drinsteht. Da ich nicht weiss,
# welche Werte denn in dieser Variablen stehen dürfen, kann ich dir dafür keinen
# Check vorgeben!!!

open my $pipe, '|-', '/etc/test.sh' or die $!;
{
local $SIG{PIPE} = 'IGNORE';
print $pipe "$variable" or die $!;
}
close $pipe or die $?;


Bei Ausführung im Browser bekomme ich nur einen allgemeinen Perl-Fehler zum Download angeboten. Bei lokaler Ausführung mittels

Code: (dl )
perl test.cgi


bekomme ich den Fehler:

Code: (dl )
1
2
Global symbol "$variable" requires explicit package name at mario.cgi line 23.
Execution of mario.cgi aborted due to compilation errors.


In beiden Fällen habe ich keine Möglichkeit, die Eingabe für den Variablenwert zu machen.

Für weitere Hilfe bin ich dankbar.

Mario
renee
 2008-07-30 14:24
#112897 #112897
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du hast einmal $variable_value und einmal $variable...

Dieser Wiki:Artikel ist lesenswert!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
nepos
 2008-07-30 14:41
#112898 #112898
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Sorry, mein Fehler. Sollte das nächste Mal zumindest perl -cw auf den Code loslassen...
Aber du solltest auch nicht einfach das Skript 1:1 übernehmen. Hatte ja geschrieben, dass es nicht getestet ist!
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2008-07-24 00:27.