Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Pavel2 29. 01. 2015, 12:52:54
-
Ahoj,
zkousim v Jave napsat jednoduchy program, ktery by mel do Windows cmd vkladat promenou, ale pokud zkusim treba
try{
String commandCMD = "msg Pavel" + rs.getString("name");
Process child = Runtime.getRuntime().exec(commandCMD);
} catch (IOException f){
System.exit(0);
}
Tak se zprava nezobrazi
Pokud udelam
try{
String commandCMD = "msg Pavel test ok";
Process child = Runtime.getRuntime().exec(commandCMD);
} catch (IOException f){
System.exit(0);
}
zprava se zobrazi. Jak mam tedy spravne vlozit promennou pro command-linu?
-
Nepředávej parametry jako pospojovanej String ale jako pole - http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#exec(java.lang.String[])
-
"Zprava se nezobrazi" je popis problemu napytel.
Zaloguj si, jak se ti slepi commandCMD, a v catchi logni vyjimku. (muj tip je, ze rs.getString nejak selze, ale je to jenom tip)
Nebo pouzij debugger.
A jak psal tdvorak, koukni na API, protoze to delas spatne i tak.
-
Pardno, neni to spatne, jen nesikovne, je tam i metoda s jednim stringem, co by mela fungovat. To lepeni je jenom koledovani si o injection
-
Chcelo by to kompletny vypis (mozno Ti to padne na niecom vyssie), pripadne v tom catch si nechaj vypisat stack trace a pastni to sem.
S tym polom (tdvorak) je to blbost.
http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#exec-java.lang.String-
Ak je rs ResultSet, tak ho korektne uzavri a nevolaj System.exit(0);
-
String commandCMD = "msg Pavel" + rs.getString("name");
co ked stlpec je "fail", mate potom "msg Pavelfail"
co ked stlpec je prazdny
nezatvarate resultsety ani statementy ani connectiony k databaze = zle pouzivate api a potom pobehuju po roote ludia co trollia ze java je pomala a pada
za system.exit(0) sa striela
-
S tym polom (tdvorak) je to blbost.
To záleží na těch parametrech. Pokud předá vše jako jeden řetězec, může se to rozbít dost snadno. Ten řetězec prochází tokenizerem, kterej ho rozseká podle bílých znaků a tokeny pak předává jako argumenty dál. Pokud tedy obsah rs.getString("name") obsahuje nějakej bordel, může se dít kdeco. .
-
Zasadni problem je, ze Runtime.getRuntime().exec(...) vytvori novy proces s novy standardnim vystupem.
public static final void main(String... args) throws Exception {
Process p = Runtime.getRuntime().exec("ls /tmp");
InputStream is = p.getInputStream();
byte[] buffer = new byte[4096];
int count = 0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((count = is.read(buffer)) >= 0) {
baos.write(buffer, 0, count);
}
System.out.println(new String(baos.toByteArray()));
}
-
'Zasadni problem je, ze Runtime.getRuntime().exec(...) vytvori novy proces s novy standardnim vystupem.'
To u MSG nevadi.
Na to, co delas ty, je lepsi pouzit ProcessBuilder a presmerovani, IMO.
-
Asi nás jako první mělo zajímat, co vlastně ten proces vypisuje. Doplnil bych do kódu ladící výpis ve stylu
try {
String commandCMD = "msg Pavel" + rs.getString("name");
Process child = Runtime.getRuntime().exec(commandCMD);
System.out.println(new Scanner(child.getInputStream()).useDelimiter("\\A").next());
} catch (IOException f) {
System.exit(0);
}
A podíval se, co vlastně ten msg command říká.
-
...a proto, mile deti, vznikly debuggery ;)
-
Moje diagnostické JSPčko co spustí proces a jeho výstup vrátí v response:
<%@ page import="java.io.BufferedReader"%><%@ page import="java.io.InputStreamReader"%><%@ page contentType="text/plain;charset=UTF-8" language="java" %>
<%
try {
response.getWriter().println("Hard limits: /bin/bash -c 'ulimit -Ha'");
response.getWriter().println();
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "ulimit -Ha"});
String line;
BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
response.getWriter().println(line);
}
input.close();
} catch (Error e) {
e.printStackTrace(response.getWriter());
}
try {
response.getWriter().println();
response.getWriter().println("Soft limits: /bin/bash -c 'ulimit -Sa'");
response.getWriter().println();
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "ulimit -Sa"});
String line;
BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
response.getWriter().println(line);
}
input.close();
} catch (Error e) {
e.printStackTrace(response.getWriter());
}
%>
-
...a proto, mile deti, vznikly debuggery ;)
Pšt... ještě si toho všimne @kit a spustí se tu děsnej flame jak na develu (http://devel.cz/otazka/pouzivate-debugger) .-)
-
aha, cize tejto jave urcite chyba test preto to nejde
aj ked debugger a php a vim...