# Perlaufruf in Java



## kumo (15. Mrz 2007)

Hallo Zusammen,

Die Frage ist vielleicht etwas dämlich, aber ich hoffe trotzdem, dass ihr mir helfen könnt.
Ich habe ein Perlskript, welches mir ein Passwort verschlüsselt. D.h es hat Methoden, bei denen man 2 Werte mitgibt und als Returnwert erhält man das verschlüsselte Passwort. Irgendwie schaffe ich es nicht, dieses Perlskript in Java umzuschreiben und habe mir darum gedacht, ob es vielleicht eine Möglichkeit gibt, dass ich irgendwie in Java diese Perlskript für mich arbeiten lassen kann. ALso dass ich in Java irgendwie diese 2 Werte mitgeben kann, dann das Perlskript laufen lasse und den Returnwert dann in Java habe und weiterarbeiten kann.

Ich denke mal das geht nicht, aber womöglich hat jemand ja eine Idee. Das beste wäre natürlich, wenn ich das Perlskript einfach in Java umschreiben könnte, damit ich die Methoden dort benutzen kann, aber das kriege ich nicht hin.

Gruss,
Kumo


----------



## Leroy42 (15. Mrz 2007)

Was verstehst du unter _Returnwert eines Perl-Scripts_?

Etwas wie in Java


```
System.exit(42);
```

Dann kommen als Returnwert ja nur Ganzzahlen in Frage!  ???:L 

Oder schreibt das Perl-Script seinen _Returnwert_ in die Konsole?


----------



## Guest (15. Mrz 2007)

So muss man sich das vorstellen:

Im Perlprogramm sieht es irgendwo so aus:


```
# PW decrypten
$decrypted_pw = decrypt($pw);
```

Die Subprozedur decrypt verschlüsselt dann einfach dieses $pw und gibt es zurück. Diesen Schritt brauche ich halt in Java. D.h ich müsste irgendwie auf die Subprezduren von einem Perlprogramm zugreifen können. Aber ich habe das Gefühl das ist wohl nicht möglich:/ Aber diese doofe Prozeduren von PERL in Java umzuschreiben geht einfach nicht richtig.

gruss


----------



## Leroy42 (15. Mrz 2007)

Anonymous hat gesagt.:
			
		

> ich müsste irgendwie auf die Subprezduren von einem Perlprogramm zugreifen können. Aber ich habe das Gefühl das ist wohl nicht möglich:/



Da trügt dich dein Gefühl leider nicht!   

Vorschlag: Schreibe dir ein Perl-Hauptprogramm daß die Verschlüsselungsroutine
aufruft und das Ergebnis auf die Konsole ausgibt (System.out in Java)

Dann rufst du dieses Programm in Java via Runtime.exec auf und liest den
Ausgabestrom des hierbei erzeugten Prozesses.

Besser wäre es jedoch, wenn du die Verschlüsselungsroutine doch
direkt nach Java transponierst.

Oder, wenn du etwas Zeit hast, schreib' einfach schnell mal
einen Perl-Interpreter in Java.


----------



## Guest (15. Mrz 2007)

Dann könnte ich also das Perlprogramm ausführen und den print in der console auslesen? Aber das bringt mir ja irgendwie nichts, da ich die Werte, die das Hauptprogramm zum Verschlüsseln braucht, in Java habe und diese ja dem Programm nicht mitgeben kann:/

Trotzdem danke für die Hilfe...anscheinend muss ich mich weiter daran versuchen, das ganze umzuschreiben.


----------



## Leroy42 (15. Mrz 2007)

Anonymous hat gesagt.:
			
		

> da ich die Werte, die das Hauptprogramm zum Verschlüsseln braucht, in Java habe und diese ja dem Programm nicht mitgeben kann



Natürlich kannst du diese mitgeben. 

a) Runtime.getRuntime().exec("perlProgramm <wert1> <wert2>")

b) Das Perl-Programm liest die Werte von der Standardeingabe und dein Java-Programm
schreibt sie dort rein.


----------



## Guest (15. Mrz 2007)

Jetzt will ich das doch einmal so versuchen...

Muss ich dann im Runtime den Aufruf so machen?

Runtime.getRuntime().exec("perl perldecrypt.pl 1111 00002847"); ? Oder wie sollte das aussehen? Und wenn ich in meinem Perlprogramm den Print habe mit dem decrypteten Passwort, wie kann ich den dann auslesen? Sollte der in der Console auftauchen?


----------



## The_S (15. Mrz 2007)

Ich hab keine Ahnung wie man ein Perl Programm aufruft, kannte auch bis gerade eben nur Pearl ... Aber entweder geht es so, oder mit einem Vorangestellten "cmd /c ".

Du kannst dir außerdem über das Process Objekt, welches exec zurückgibt noch den input bzw. output stream holen und somit die ausgabe direkt in deinem java-programm verarbeiten.


----------



## Guest (15. Mrz 2007)

Nach ein wenig googeln habe ich es nun so:

```
Runtime runtime = Runtime.getRuntime();
            Process process = runtime.exec("perl perldecrypt.pl 1111 00002847");
     
            try {
            process.waitFor();
            }
            catch (InterruptedException e) {
            e.printStackTrace();
            }
            System.out.println("Exit value: " + process.exitValue());
            BufferedReader reader =
            new BufferedReader(
            new InputStreamReader(process.getInputStream()));
            String s = reader.readLine();
            System.out.println("perl said [ " + s + " ]");
            }
```

Leider gibt es mir immer 0 zurück, obwohl, wenn ich das perl alleine teste, der print in der console "test" ist.


----------



## The_S (15. Mrz 2007)

WO wird 0 zurück gegeben? Bei Exit-Value oder beim input stream? versuchs mal ohne p.waitFor und mach gleich nach dem aufruf deinen Stream. Imho sollte der dann gesperrt werden bis etwas ausgegeben wird ...


----------



## Guest (15. Mrz 2007)

Um das ganze zu Testen habe ich nun ein realtiv simples Perlprogramm:


```
#!/usr/bin/perl
print "Hello Java!";
```

Im Java mache ich:

        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("perl pfad/testjava.pl");

        BufferedReader reader =
        new BufferedReader(
        new InputStreamReader(process.getInputStream()));
        String s = reader.readLine();
        System.out.println("perl said [ " + s + " ]");
        }

Leider ist im InputStream immer noch null, und leider nicht "hello java" oder sonstiges.


----------



## The_S (15. Mrz 2007)

moment, der Reader ist "0" oder "null"? Das ist ein erheblicher Unterschied? Und der Reader ist null oder die Ausgabe ist null (bzw. "0")?


----------



## Guest (15. Mrz 2007)

Wenn ich den Reader mit 


```
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String s = reader.readLine();
```

auslese und s herausschreibe erhalte ich NULL. Wenn ich das selbe mit dem wait mache ist es ebenfalls null.


----------



## Leroy42 (15. Mrz 2007)

Da ich keine Perl habe, habe ich einfach mal ein "dir" gemacht:

```
try { 
    		Process process = Runtime.getRuntime().exec("cmd \\c dir"); 
    		
    		BufferedReader reader = 
    			new BufferedReader( 
    					new InputStreamReader(process.getInputStream())); 
    		String s = reader.readLine(); 
    		System.out.println("perl said [ " + s + " ]"); 
    		process.waitFor(); 
    		System.out.println("Exit value: " + process.exitValue()); 
    	} 
    	catch (Exception e) { 
    		e.printStackTrace(); 
    	}
```

Ergebnis: perl said [ Microsoft Windows XP [Version 5.1.2600] ]

Eben die erste Zeile des "Programmaufrufs"


----------



## The_S (15. Mrz 2007)

Dann ist der Stream wohl zu ende ... lass dein perl programm mal mehrere Zeilen ausgeben.


----------



## Guest (15. Mrz 2007)

Leroy42 hat gesagt.:
			
		

> Da ich keine Perl habe, habe ich einfach mal ein "dir" gemacht:
> 
> ```
> try {
> ...



Wenn ich bei mir im Runtime auch nur schon ein cmd einfuelle, egal was nachher kommt, erhalte ich das selbe^^

Ansonsten auch kein Erfolg mit einem Perl, welches mehrere Zeilen ausgibt. Langsam bin ich am Ende -.-


----------



## Leroy42 (15. Mrz 2007)

Anonymous hat gesagt.:
			
		

> Langsam bin ich am Ende -.-



Nicht aufgeben!!! Bald haben wir's geschafft!   

Allerdings habe ich jetzt auch etwas merkwürdiges entdeckt:


```
import java.io.*;

public class Perlinchen {
    public static void main(String[] args) {
    	try {
    		Process process = Runtime.getRuntime().exec("cmd \\c dir");

    		BufferedReader reader =
    			new BufferedReader(
    					new InputStreamReader(process.getInputStream()));
    		String s;

    		while ((s = reader.readLine()) != null)
    			System.out.println(s);
    	}
    	catch (Exception e) {
    		e.printStackTrace();
    	}
    }
}
```

Ausgabe:



			
				JVM hat gesagt.:
			
		

> Microsoft Windows XP [Version 5.1.2600]
> (C) Copyright 1985-2001 Microsoft Corp.



Also insgesamt drei Zeilen (Edit: Die Leerzeile am Ende wird nicht mit zitiert).
 Und dann hängt er in einer Endlosschleife!  :autsch:  ???:L 

Wieso das denn auf einmal?


----------



## Guest (15. Mrz 2007)

Ich bin wieder einen Schritt weiter! Die Ausgabe von "test" erhalte ich nun. Man glaubt es kaum, aber das Problem war der Pfad. Aus irgendeinem Grund hat dieser nicht gepasst. Jetzt wo das File direkt im Verzeichnis der Javadinger ist, funzt es Leider klappt das mit der Übergabe der Parameter noch nicht. Vielleicht mein Fehler im Perl.
Geht das nicht so ähnlich ala:


```
my ($src, $cipher_pv) = @_;
```

?


----------



## The_S (15. Mrz 2007)

@Leroy

Vermutlich weil am Ende kein Return mehr kommt, der Stream aber auf eine neue Zeile wartet!?

@Gast

naja, du musst schon selber wissen, wie du einem Perl programm parameter übergibst ...


----------



## Guest (15. Mrz 2007)

Bin gerade im Internet auf der Suche danach Ich muss vielleicht dazu erwähnen, dass ich nicht wirklich Ahnung von Perl habe. Genau aus diesem Grund will ich es ja nicht in Java umschreiben


----------



## Leroy42 (15. Mrz 2007)

Anonymous hat gesagt.:
			
		

> ```
> my ($src, $cipher_pv) = @_;
> ```



Ich bin kein Perlaner und weiß nach diesem Codeausschnitt auch wieder warum nicht.   

@Hobbit: Aber wie bekomme ich dann die Ausgabe eines einfachen _dir_ hin.

Früher konnte ich das doch noch.  ???:L  :autsch: 

(Mein Gott! Sind das jetzt etwa schon die ersten Anzeichen von Arthritis (ähh: Asterix (ääh: ....)))


----------



## Guest (15. Mrz 2007)

So, ihr beiden. Unglaublich, ich hab' es endlich geschafft Ich danke Euch für die riesige Hilfe. Bin wirklich saufroh, dass es endlich geklappt hat.

Falls irgendwann eine arme Seele per Google mit dem gleichen Problem hierherfindet...und nach der Parameterübergabe schaut:


```
my ($src, $cipher_pv) = @ARGV;
decrypt($src,$cipher_pv);
```

und im Java:


```
Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec("perl perldecrypt.pl 1111 11111111");
        
        try {
            process.waitFor();
        }
        catch(InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Exit value: " + process.exitValue());
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String s = reader.readLine();
        System.out.println("perl said [ " + s + " ]");
    }
```

Gruss,
kumo


----------



## The_S (15. Mrz 2007)

@Leroy

Weil dir evtl. als letztes Zeichen ein Zeilenumbruch macht?


----------



## Leroy42 (15. Mrz 2007)

Anonymous hat gesagt.:
			
		

> So, ihr beiden. Unglaublich, ich hab' es endlich geschafft Ich danke Euch für die riesige Hilfe. Bin wirklich saufroh, dass es endlich geklappt hat.



Dann mach's gut und empfiehl uns weiter.   

Ich und Hobbit sind noch nicht ganz fertig!   



			
				Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Weil dir evtl. als letztes Zeichen ein Zeilenumbruch macht?



Das erklärt die letzte Leerzeile (die ich nicht zitieren kann). Aber es
erklärt nicht die Endlosschleife  ???:L 

Könnte es daran liegen, daß ich "cmd" irgendwie so aufrufe, daß
dieser noch auf Eingaben wartet?

Wie verhindere ich daß? Oder soll ich per Java ein "exit\n" in den
Ausgabestrom schreiben?

Trotz meiner Arthritis (ääh: Irgendwas mit _Al..._ du weißt schon) bin ich
mir aber sicher, daß ich das früher nicht so gemacht habe.


----------



## The_S (15. Mrz 2007)

Das ist keine endlosschleife sondern n Deadlock. Der Stream wartet praktisch ewig bis das return kommt, damit er "eine zeile" lesen kann!

[edit] zumindest glaube ich das


----------



## Leroy42 (15. Mrz 2007)

Ich hab's endlich   . Es muß heißen

_cmd /c dir_

und nicht

_cmd \\c dir_


----------



## Leroy42 (15. Mrz 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Das ist keine endlosschleife sondern n Deadlock.



Sicher! Hatte wegen der Aufregung nur die Begriffe verwirbelt.   

Aber jetzt bin ich ja wieder beruhigt.


----------



## The_S (15. Mrz 2007)

Leroy42 hat gesagt.:
			
		

> Ich hab's endlich   . Es muß heißen
> 
> _cmd /c dir_
> 
> ...



lol ... son scheiß ... augrund deines posts hab ich mir alles nochmal angeguckt und festgestellt, dass ein "einfach mal drüber fliegen" doch nicht genug war => Ich hab die ganze Zeit von was vollkommen anderem geredet, weil ich gedacht hab du meisnt was anderes


----------



## AlArenal (15. Mrz 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> lol ... son scheiß ... augrund deines posts hab ich mir alles nochmal angeguckt und festgestellt, dass ein "einfach mal drüber fliegen" doch nicht genug war => Ich hab die ganze Zeit von was vollkommen anderem geredet, weil ich gedacht hab du meisnt was anderes



Ja, Forum-Posts sind wie Frauen - schnell mal drüber bringt oft nicht das gewünschte Ergebnis.


----------



## The_S (15. Mrz 2007)

AlArenal hat gesagt.:
			
		

> Ja, Forum-Posts sind wie Frauen - schnell mal drüber bringt oft nicht das gewünschte Ergebnis.



Ach deswegen will meine Freundin schluss machen ... 

...

hm, da fällt mir dieses eine GBO Zitat ein:

"Liebesfilme wecken bei Frauen nur unrealistische Vorstellungen für das echten Leben.
Das ist genauso wie bei Männern und Pornos!"


----------



## Leroy42 (15. Mrz 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> AlArenal hat gesagt.:
> 
> 
> 
> ...



*Gemeiner Dieb!*  :x 

 Ich wollte gerade schreiben: 



			
				Der zu langsame Leroy hat gesagt.:
			
		

> AlArenal hat gesagt.:
> 
> 
> 
> ...


----------



## Leroy42 (15. Mrz 2007)

(Jetzt aber schnell zurück ins Körbchen. Sonst werden wir noch gesplittet
und landen mal wieder in der Plauderecke   )


----------



## The_S (15. Mrz 2007)

*g* ... och das gabs schon lange nicht mehr ... wird mal wieder Zeit :lol:


----------



## Leroy42 (15. Mrz 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> *g* ... och das gabs schon lange nicht mehr ... wird mal wieder Zeit :lol:



Meinst du wir könnten das irgendwie provozieren oder erzwingen?  :shock: 

Aber wie bloß?  ???:L (  )


----------



## The_S (15. Mrz 2007)

hm, keine Ahnung ... lass mal überlegen.

Evtl. könnten wir uns selbst bei admin oder mod anzeigen!?


----------



## Leroy42 (15. Mrz 2007)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> hm, keine Ahnung ... lass mal überlegen.
> Evtl. könnten wir uns selbst bei admin oder mod anzeigen!?



Nicht schlecht. Aber ich weiß nicht wie das geht?

Hat hier sonst noch jemand eine Idee? 

Bitte  :meld:


----------



## The_S (15. Mrz 2007)

warten wir einfach bis jango den Thread entdeckt, der fällt bestimmt was ein


----------



## Leroy42 (15. Mrz 2007)

Schade, die ist g'rad nicht online.   

Wo die sich bloß wieder rumtreibt? 







 :noe:


----------



## Jango (15. Mrz 2007)

Was soll mir einfallen - wie ihr beide mit Macht einen Sinnlos-OT erzwingt? Wieso? Ist doch schon geschehen - nur steht er noch nicht im richtigen Forum... 

@ beide  :bae:


----------



## The_S (15. Mrz 2007)

Hm, jemand muss moderator werden ... dann können wir unsere Sinnlos-OT absplitten wann immer wir wollen!


----------



## Leroy42 (15. Mrz 2007)

Ich schlage Jango vor, die hat insowas schon Übung.


----------



## Jango (15. Mrz 2007)

Bitte?
Worin Übung?
Zum Mod bin ich zu blöd...


----------



## Leroy42 (15. Mrz 2007)

nur @Hobbit:

Hör nicht auf die (was sie dir im ICQ gesagt hat). Sie sagte, daß du sagtest, daß Java-Forum sei Edit: hier stand etwas was hier nicht hingehört


----------



## The_S (15. Mrz 2007)

Zensur odda wie?

Ich glaub gar niemanden, außer mir selber!


----------



## Leroy42 (15. Mrz 2007)

Selbstzensur.


----------



## The_S (15. Mrz 2007)

1. Schritt zur Besserung


----------



## Leroy42 (15. Mrz 2007)

Mußt du immer das letzte Wort haben?

(ich glaube wir schaffens noch)


----------



## The_S (15. Mrz 2007)

jup, muss ich!


----------

