Vkládání argumentu z Javy do Windows cmd

Pavel2

Vkládání argumentu z Javy do Windows cmd
« kdy: 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?
« Poslední změna: 29. 01. 2015, 22:32:53 od Petr Krčmář »


tdvorak

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #1 kdy: 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[])

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #2 kdy: 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.

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #3 kdy: 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

r

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #4 kdy: 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);


perceptron

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #5 kdy: 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


tdvorak

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #6 kdy: 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. .


chearius

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #7 kdy: 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()));
    }

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #8 kdy: 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.

tdvorak

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #9 kdy: 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á.

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #10 kdy: 29. 01. 2015, 14:02:19 »
...a proto, mile deti, vznikly debuggery ;)

Tonda

  • *****
  • 631
    • Zobrazit profil
    • E-mail
Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #11 kdy: 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());
    }
%>

tdvorak

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #12 kdy: 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 .-)

perceptron

Re:Vkladani argumentu z Javy do Windows cmd
« Odpověď #13 kdy: 29. 01. 2015, 19:05:31 »
aha, cize tejto jave urcite chyba test preto to nejde
aj ked debugger a php a vim...