Execução de programa no MS-DOS

Java

12/04/2011

Boa tarde pessoal,

    Estou trabalhando em um pequeno projetinho que utiliza Postgres. Preciso executar a instrução:

psql –p 5432 –U postgres -d master -f c:\schema.sql

    Quando executo esta instrução ela pede uma senha.

    Pois bem, gostaria de saber se existe a possibilidade de eu executar a instrução acima e em seguida enviar para este processo a senha, como se eu estivesse digitando no console do MS-DOS e teclado enter, para poder prosseguir com a execução do mesmo.
    Alguém já implementou algo parecido ou já esteve em situação similar?

    Eu estava tentando esta solução:


      try {
            String line;
            OutputStream stdin = null;
            InputStream stderr = null;
            InputStream stdout = null;

            // launch EXE and grab stdin/stdout and stderr
            Process process = Runtime.getRuntime().exec("psql –p 5432 –U postgres -d master -f c:\\schema.sql");

            stdin = process.getOutputStream();
            stderr = process.getErrorStream();
            stdout = process.getInputStream();

            // "write" the parms into stdin
            line = "postgres" + "\n";
            stdin.write(line.getBytes());
            stdin.flush();
            stdin.close();

            // clean up if any output in stdout
            BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(stdout));
            while ((line = brCleanUp.readLine()) != null) {
                System.out.println ("[Stdout] " + line);
            }
            brCleanUp.close();

            // clean up if any output in stderr
            brCleanUp = new BufferedReader(new InputStreamReader(stderr));
            while ((line = brCleanUp.readLine()) != null) {
                System.out.println ("[Stderr] " + line);
            }
            brCleanUp.close();

      } catch (IOException ex) {
            Logger.getLogger(TESTE.class.getName()).log(Level.SEVERE, null, ex);
      }



    Mas não consegui nenhum resultado até o momento.

Desde já agradeço!


Abraão Monteiro

Abraão Monteiro

Curtidas 0

Respostas

Davi Costa

Davi Costa

12/04/2011

Abraão,
estou bem curioso pelo progresso nessa Thread.
Realmente nuna havia pegue esses requisitos, estou bem curioso pela sua solução.
Mas se ajudar caso não achasse nenhuma solução, eu abriria a conexão normalmente no java(jdbc ou framework de ORM) e leria o arquivo e processaria o arquivo.

Espero ter dado alguma luz.

Att Davi
GOSTEI 0
Dyego Carmo

Dyego Carmo

12/04/2011

Tentou mandar um "println("senha")" no stdout ?

GOSTEI 0
Abraão Monteiro

Abraão Monteiro

12/04/2011

    Ainda não Dyego, vou tentar aqui e posto para você posteriormente.
    Só para enriquecer o post. Segue um segundo source a respeito do mesmo assunto.

@Test
public void testSQLExecution() throws Exception {
       String path = "C:/tmp";
       List<String> commandList = new ArrayList<String>();
       commandList.add("psql");
       commandList.add("-f");
       commandList.add("test.sql");
       commandList.add("-h");
       commandList.add(HOST);
       commandList.add("-p");
       commandList.add(PORT);
       commandList.add("-U");
       commandList.add(DATABASE);
       commandList.add(SCHEMA);

       ProcessBuilder processBuilder = new ProcessBuilder(commandList);
       processBuilder.directory(new File(path));
       processBuilder.redirectErrorStream(true);

       Process p = processBuilder.start();

       String line;
       BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
       BufferedWriter out = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

       out.write("password");
       out.newLine();
       out.flush();
       out.close();

       // When this line is reached, the execution halts.
       while (input.ready() && (line = input.readLine()) != null) {
             System.out.println(line);
       }

       if (p.waitFor() != 0) {
          Assert.fail("The process did not run succesfully.");
       }

       input.close();
}


GOSTEI 0
Abraão Monteiro

Abraão Monteiro

12/04/2011

O jeito foi passar sem senha mesmo. Gravei a senha em um arquivo de configuração e quando executo ele simplesmente utiliza esse arquivo para executar com os privilégios necessários não exibindo o prompt.
GOSTEI 0
Dyego Carmo

Dyego Carmo

12/04/2011

Poderia fechar o Post ?

Valeu !

GOSTEI 0
POSTAR