Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Pavel2 29. 01. 2015, 12:52:54

Název: Vkládání argumentu z Javy do Windows cmd
Přispěvatel: 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

Kód: [Vybrat]
   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

Kód: [Vybrat]
   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?
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: tdvorak 29. 01. 2015, 13:03:25
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[])
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: Ondra Satai Nekola 29. 01. 2015, 13:05:27
"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.
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: Ondra Satai Nekola 29. 01. 2015, 13:08:24
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
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: r 29. 01. 2015, 13:11:56
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);
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: perceptron 29. 01. 2015, 13:22:11
Citace
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

Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: tdvorak 29. 01. 2015, 13:24:06
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. .

Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: chearius 29. 01. 2015, 13:40:56
Zasadni problem je, ze Runtime.getRuntime().exec(...) vytvori novy proces s novy standardnim vystupem.

Kód: [Vybrat]
    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()));
    }
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: Ondra Satai Nekola 29. 01. 2015, 13:55:46
'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.
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: tdvorak 29. 01. 2015, 13:56:22
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

Kód: [Vybrat]
  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á.
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: Ondra Satai Nekola 29. 01. 2015, 14:02:19
...a proto, mile deti, vznikly debuggery ;)
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: Tonda 29. 01. 2015, 14:02:44
Moje diagnostické JSPčko co spustí proces a jeho výstup vrátí v response:
Kód: [Vybrat]
<%@ 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());
    }
%>
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: tdvorak 29. 01. 2015, 14:59:46
...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) .-)
Název: Re:Vkladani argumentu z Javy do Windows cmd
Přispěvatel: perceptron 29. 01. 2015, 19:05:31
aha, cize tejto jave urcite chyba test preto to nejde
aj ked debugger a php a vim...