Page 1 of 1

Java and Linux Problems !!

Posted: Tue May 04, 2004 5:56 pm
by PaP
Ξαναπαραθέτω τον καινούριο κώδικα. Οσο για τις παραμέτρους που παίρνει το cgi τις εχω βάλει μέσα στο cmd χώρις εκείνο το ηλίθιο OutPutStream Που βλέπετε εδώ αλλά και πάλι τίποτα.
Η ερώτηση μου είναι σχετικά απλή ! Πώς μπορώ να τρέξω ένα cgi-script περνώντας του ένα ορισμένο argument...
Είμαι τουλάχιστον 2 εβδομάδες στο ίδιο σημείο !!!

Code: Select all

//Set environment variables
String[] setVar = {"REQUEST_METHOD=POST","CONTENT_LENGTH="+extra.length};
String[] cmd = {"/bin/bash","./home/pap/jhttp"+Petition_Analysis.pt.uri.path};

//Execute the cgi-bin with the appropriate input
Process cgiOut = Runtime.getRuntime().exec(cmd,setVar);

// get its output (your input) stream
DataOutputStream put = new DataOutputStream(cgiOut.getOutputStream());
put.writeBytes(Petition_Analysis.pt.Pet_Body);
DataInputStream in = new DataInputStream(cgiOut.getInputStream());

// Read and print the output
String line;
StringBuffer page = new StringBuffer();
while ((line = in.readLine()) != null) {
page.append(line);
}

//Send page to client
out.print("HTTP/1.1 200 OK\r\n");
out.print("Content-Length: " + page.toString().length() +"\r\n\r\n");
System.out.print(page);


Cgi call is like that:
./post_from.cgi
first_operand=342&second_operand=32&operation=-[/code]

Posted: Tue May 04, 2004 10:15 pm
by vagalati
Απ'ότι καταλαβαίνω εσύ δημιουργείς ένα παιδί της διεργασίας που τρέχεις, το οποίο (παιδί) είναι το γνωστό bash. Ότι μεταβλητή και να βάλεις εκεί όμως θα ισχύει σε εκείνο το session μόνο και όχι globally με αποτέλεσμα να φαίνεται σαν να μη κάνει τίποτα.

Posted: Tue May 04, 2004 11:03 pm
by PaP
Ξέρεις τι μπορώ να κάνω για αυτό;
Θέλω δυο μεταβλητές περιβάλλοντος και στο καπάκι να τρέξω ένα cgi-bin.
Τρέχει μεν αλλά χωρίς τις μεταβλητές δεν κάνει τίποτα....

Posted: Wed May 05, 2004 2:02 am
by HdkiLLeR
Θέσε global μεταβλητή περιβάλοντος.
Όπως σου είπαν και παραπάνω με τον τρόπο που το κάνεις μόλις επιτρέψει η διεργασία παιδί σταματάει να υπάρχει η μεταβλητή που έθεσες. Αυτό που μπορείς να κάνεις είναι αντί για export κάνε setenv προκειμένου να θέσεις κάτι globally.

Setenv ??

Posted: Wed May 05, 2004 2:58 pm
by PaP
Δε μπορώ να τη βρω ούτε στο σύστημα μου ούτε σε αυτό του πανεπιστημίου. Ναι μεν το δικό μου είναι Mandrake αλλά στη σχολή είνα Debian

Posted: Wed May 05, 2004 11:47 pm
by vagalati
Νομίζω ότι η setenv κάνει το ίδιο πράγμα με την export αλλά είναι σε csh και όχι σε bash. Αρχίζω να πιστεύω ότι αυτό που ζητάς είναι αδύνατο (θα ήταν εφικτό αν μπορούσαμε να εκτελέσουμε την export στο shell μαμά (και όχι παιδί) του προγράμματος java που εκτελείς αφού οι μεταβλητές του parent είναι προσβάσιμες απο τα παιδιά. Αν βρώ κάποια εντολή που να κάνει ότι και η export αλλά globally θα σε ενημερώσω...
PaP wrote:Ναι μεν το δικό μου είναι Mandrake αλλά στη σχολή είνα Debian
Σβήσε το γρήγορα πριν σε δεί ο σκληροσκοτώστρας (καραδοκεί τελευταία με μια καραμπίνα και είναι έτοιμος να βαρέσει όποιον λέει κάτι τέτοιο. :-D :-D :-D )

Posted: Thu May 06, 2004 2:44 am
by HdkiLLeR
Όπως το λέει ο vagalati είναι τελιά το setenv έιναι σχεδόν ίδιο με το export. Βασικά γιατί δεν δοκιμάζεις το εξής:

1)Κάνε login και άνοιξε ένα session.
2)Όρισε με το χέρι την μεταβλητή export blah blah.
3)και στην συνέχεια τρέξε το προγραματάκι σου.

Με αυτόν τον τρόπο μιας και το prog θα εκτελεστεί σε μια διεργασία child και σε αυτήν θα έχουν περάσει οι μεταβλητές που έχουν οριστεί απο την διεργασία(bash) γονέα. Δεν ξέρω βέβαια εάν σε βοηθήσει αυτό αλλά σαν σκέψη στο λέω.

Posted: Thu May 06, 2004 3:58 pm
by vagalati
Έψαξα για την εντολή να ορίζει variables ορατά σε όλα τα shells που ανοίγεις αλλά φαίνεται να μην υπάρχει κάτι τέτοιο. Μπορείς να μας πείς γιατί το θες αυτό; (Φαντάζομαι ότι κάποιο άλλο πρόγραμμα θα διαβάζει την μεταβλητή.)

Μεταβλητές ΟΚ, αλλά...

Posted: Wed May 12, 2004 7:42 pm
by PaP
Σύμφωνα με το ΑΡΙ τησ Java στην εντολη exec περνάς πρώτα έναν πίνακα με τις εντολές που θες και μετα με τισ μεταβλητές περιβάλλοντος που χρειάζεισαι. Οπότε είμαστε ΟΚ, κοιτάχτε το αρχικό ποστ γιατί το έχω αλλάξει. Και πάλι όμως δε λειτουργει !!!

Re: Java and Linux Problems !!

Posted: Wed May 12, 2004 9:25 pm
by HdkiLLeR
PaP wrote:

Code: Select all

//Set environment variables
String[] setVar = {"REQUEST_METHOD=POST","CONTENT_LENGTH="+extra.length};
String[] cmd = {"/bin/bash","./home/pap/jhttp"+Petition_Analysis.pt.uri.path};
Petition_Analysis.pt.uri.path αυτό που έιναι ορισμένο και τι τιμή έχει;

Posted: Wed May 12, 2004 10:21 pm
by PaP
Είναι το σχετικό URL που στην ουσία δίνει το script που πρέπει να εκτελεσθεί.
Επίσης έχω αφαιρέσει την τελεία από μπροστα γιατί δε χρείαζεται μέτα από δοκιμές

Posted: Wed May 12, 2004 11:46 pm
by Einherjar
Λογικά το σκριπτάκι σου θα παίρνει σαν παράμετρο string (δεν κατάλαβα τι είναι το Petition_Analysis.pt.Pet_Body). οπότε δεν χρειάζεται να φτιάξει DataOutputStream. Σου αρκεί ένα PrintWriter. Μπορείς να κάνεις δηλαδή:

Code: Select all

PrintWriter put = new PrintWriter(cgiOut.getOutputStream());
put.println(Petition_Analysis.pt.Pet_Body);
put.close();
και όμοια χωρίς να φτιάξεις ένα DataInputStream μπορείς να κάνεις το παρακάτω

Code: Select all

BufferedReader in = new BufferedReader( new InputStreamReader(cgiOut.getInputStream()));
String line;

while ((line = in.readLine()) != null)
    page.append(line); 

in.close();
Ελπίζω να βοήθησα

Posted: Fri May 14, 2004 5:37 pm
by PaP
Σορρυ για τα αγγλικά αλλά το έκανα copy-paste από το φόρουμ της Χάβα (όπως λένε και οι ισπανοί :-) )

Final Code ! Works but still is missing something.
The problem now is that the cgi script only reads one argument of the input, normally there are three. So i have only 1/3 of the normal ouput. As i posted before the cgi scipt works flawlessly in command prompt. One more little problem is that i view the full html code in my browser window and not the hypertext

Code: Select all

//Set environment variables
String[] setVar = {"CONTENT_LENGTH="+extra.length,"REQUEST_METHOD=POST"};
String[] cgi = {"python","/home/pap/jhttp"+Petition_Analysis.pt.uri.path};

//Execute the cgi-bin with the appropriate input
Process cgiOut = Runtime.getRuntime().exec(cgi,setVar);

DataOutputStream put = new DataOutputStream(cgiOut.getOutputStream());
put.writeChars(Petition_Analysis.pt.Pet_Body);
put.flush();
put.close();
InputStream in = cgiOut.getInputStream();

// Read and print the output
int c;
StringBuffer page = new StringBuffer();

c = in.read();
while (c!=-1){
if (c>0)
page.append((char) c);
c = in.read();
}

in.close();
//Send page to client
out.print("HTTP/1.1 200 OK\r\n");
out.print("Content-Length: " + page.length() +"\r\n\r\n");
out.print(page);
:lol: :lol: :lol: :lol: :lol: :lol: :lol: :shock: :shock:

Posted: Fri May 14, 2004 6:18 pm
by Einherjar
Το κοίταξες καθόλου αυτό που σου έγραψα ή τσάμπα το έγραφα??? :???:

Posted: Fri May 14, 2004 6:58 pm
by PaP
Ναι το κοίταξα και το μόνο που όπως βλέπω έχω ξεχάσει είναι το println