Undrar om någon vet hur man anropar ett UNIX-script med argumnet från en JSP.sida, Ungefär som qx-kommandot i Perl? Bara ett par frågor först innan jag kan ge dig ett svar. Jag förmodar att det är ett shell script du vill ropa på? Vad är det som du vill utföra med detta? En bättre approach, om du nu måste använda scriptet, är nog i så fall att anropa det från en java klass i affärslogiken och förse .jsp sidan med resultatet. Men det är svårt att säga något om det egentligen innan du kommer med lite mer information. ok! Det är ett shellscript jag ropar på. Detta scriptet anropar bla ett C-program som via IPC ligger och lysssnar på ett annat C-program bla bla bla... Därefter sätter shellscriptet upp en html-ström med med input från C-Programmet och skicckar till baka till jsp.sidan. Det är ett tag sedan jag gjorde det där men jag tror att du gör ungefär på detta sätt: Tack så mycket! Du kan göra ovanstående kod, som jag skrev innan, på jsp-sidan i ett try/catch block. Gör du det innanför <% %> går det ju bra. Men det är inte en vacker lösning men det kanske inte spelar någon roll? Glöm inte att importera rätt klasser till .jsp sidan också. Angående parametrar vet jag att det ska gå att göra...men kommer inte ihåg hur. Jag återkommer när jag kollat upp detta. Ok, jag skrev ihop en liten snabb testklass och jag fick det att fungera...i alla fall på free bsd. Tack! Koden jag skrev var ju inte någon jsp sida utan en klass som var tänkt för att visa hur det går till att anropa ett shell script. Jag vet inte riktigt vilka kunskaper du har inom java men om du vill göra detta anrop från en jsp sida kan du göra som koden nedan. Dock är inte detta en "snygg" lösning. Man ska helst inte ha någon kod alls på jsp sidor utan istället använda sig av taglibs eller kanske på sin höjd java beans. Detta är kanske lite overkill för din lösning och vill du få det att fungera snabbt och snygga upp saker och ting senare kan du skriva följande sida: p.waitFor(); blir på något sätt hängande. När jag kör mitt script från "shellet" funkar allt bra. Någon ide på en lösning? Hej!Anropa unixscript från JSP?
Sv: Anropa unixscript från JSP?
/KlasSv: Anropa unixscript från JSP?
Om du tycker jag skall sätt upp en klass för detta skulle jag bli själaglad om du ville ge ett exempel på hur detta kan se ut då jag precis har börjat grotta i jsp!
TACK!
Mvh BondSv: Anropa unixscript från JSP?
<code>
Process p = Runtime.getRuntime.exec(new String[] {"/bin/sh", "-c",
"/home/myhome/scripts/myscript.sh"});
p.waitFor();
// läs output från shell script
BufferedReader br = new BufferedReader (new InputStreamReader(p.getInputStream()));
StringBuffer result = new StringBuffer();
while(br.readLine() != null) {
result.append(br.readLine());
}
// skriv resultatet till system out
System.out.println(result.toString());
</code>
Skriv en testklass och se om det fungerar. Har inte hunnit testa det själv. Självklart borde du kanske ha någon typ av config fil där man kan ange var shell scriptet finns om du t ex flyttar applikationen till en annan maskin.
Jag kan ha glömt något i exemplet ovan så hör av dig igen om det inte skulle fungera. Eller om du har andra frågor.
/KlasSv: Anropa unixscript från JSP?
Är det möjligt att skicka med argument till scriptet som skall köras. Altså om jag kan ange argument efter myscript.sh och hur det ser ut med fnuttat osv.
Måste all kod på jsp-sidan ligga i en klass och sen att man gör nedanstående i en try/catch? Eller hur gör jag? jag får nedanstående felmeddelande när jag kör min sida nu.
128 'try' without 'catch' or 'finally'. out.print(__jsp_StaticText.text[1]);
133 Type expected. catch( Exception e) {
156 Class or interface declaration expected. } Sv: Anropa unixscript från JSP?
/KlasSv: Anropa unixscript från JSP?
<code>
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ShellTest {
public static void main(String[] args) {
try {
Process p = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", "/home/mydir/test.sh param1 param2"});
p.waitFor();
if(p.exitValue() != 0) {
// kasta ett exception
}
BufferedReader br = new BufferedReader (new InputStreamReader(p.getInputStream()));
StringBuffer result = new StringBuffer();
String line;
while((line = br.readLine()) != null){result.append(line);}
System.out.println(result.toString());
}
catch(IOException iox) {
iox.printStackTrace();
}
catch(InterruptedException ix) {
ix.printStackTrace();
}
}
}
</code>
Jag tror du förstår hur det fungerar.
Lycka till
/KlasSv: Anropa unixscript från JSP?
Skall denna sida sparas som jsp och skall koden ha <%%>? Anropar ju sidan från en formulärsida som skickar POST-värden och det går inte så bra.Sv: Anropa unixscript från JSP?
<code>
<%@ page import="java.io.IOException, java.io.BufferedReader,java.io.InputStreamReader" %>
<html>
<head>
</head>
<body>
<%
String param1 = request.getParameter("param1");
String param2 = request.getParameter("param2");
String cmd = "/home/mydir/test.sh " + param1 + " " + param2;
try {
Process p = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd});
p.waitFor();
if(p.exitValue() != 0) {
// kasta ett exception
}
BufferedReader br = new BufferedReader (new InputStreamReader(p.getInputStream()));
StringBuffer result = new StringBuffer();
String line = null;
while((line = br.readLine()) != null){result.append(line);}
out.print(result.toString());
}
catch(IOException iox) {
iox.printStackTrace();
}
catch(InterruptedException ix) {
ix.printStackTrace();
}
%>
</body>
</html>
</code>
Det här skulle kunna fungera men jag har inte provat det. Och jag vill säga det igen, det är absolut inget jag rekommenderar att göra så här men det kanske kan ge dig idéer om hur du kan lösa det snyggare.
/KlasSv: Anropa unixscript från JSP?
Sv: Anropa unixscript från JSP?
Jag vet inte om hängande är rätt ord men uttrycket...
Process p = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd});
p.waitFor();
if(p.exitValue() != 0) { }
...blir sant varje gång. Jag misstänker att p.waitFor(); blir "hängande" på något sätt. I och med att scriptet funkar i shellet så vet jag ju att mitt script fungerar som det skall. Men av någon anledning så blir det "knas" när jag kör...
Process p = Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", cmd});
p.waitFor();