Interagir com Runtime.getRuntime().exec("comando");

7 respostas
S

Olá

Estou fazendo uma aplicação em java que precisa interagir com o shell.
O problema é que quando executo:

Runtime.getRuntime().exec("comando");

Esse comando pede uma resposta de “yes” ou “no”.
Então, não estou conseguindo interagir para dar entrada com a resposta.

Alguém pode me ajudar?

7 Respostas

S

Na minha aplicação em java eu preciso executar alguns comando no shell.

Executando no console é assim:

root@comp# pamusb-conf --add-device MyDevice Please select the device you wish to add. * Using "Kingston DataTraveler 2.0 (Kingston_DataTraveler_2.0_5B730492D024-0:0)" (only option)

Which volume would you like to use for storing data ?
* Using "/dev/sdb1 (UUID: C400-4E2C)" (only option)

Name : Blabla2
Vendor : Kingston
Model : DataTraveler 2.0
Serial : Kingston_DataTraveler_2.0_5B730492D024-0:0
UUID : C400-4E2C

Save to /etc/pamusb.conf ?
[Y/n] y
Done.
root@comp:#

Este comando cadastra meu Pen-drive num XML.
Percebe que no final ele me faz a pergunta [Y/n].
Executando pelo java não sei como fazer para entrar com a resposta de "y".

Meu código está da seguinte maneira:

try {
        Process p = Runtime.getRuntime().exec("pamusb-conf --add-device MyDevice");
        BufferedReader br = new BufferedReader ( new InputStreamReader ( p.getInputStream() ));
        String s1;
        while ( ( s1 = br.readLine() ) != null )
            System.out.println("getInputStream:");
            System.out.println(s1);

        br = new BufferedReader (new InputStreamReader (p.getErrorStream() ));
            while ( ( s1 = br.readLine() ) != null )
                System.out.println("getErrorStream:");
                System.out.println(s1);
    } catch (IOException ioe) {
        System.out.println(ioe);
    }

Alguém pode me ajudar?

peczenyj

se vc esta sob mudno unix vc pode fazer isso

echo “yes” | comando # talvez funcione em outros S.Os…

ou vc poderia criar um script usando Expect, que tem um idioma para vc interagir dependendo da resposta.

solução 100% java vc pode pegar o objeto Process que representa o seu processo e é retornado pelo metodo exec e, então,

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Process.html

vc pode pegar o output stream getOutputStream e ‘escrever’ nele com o metodo write -> não esquecendo o “\n”

http://mindprod.com/jgloss/exec.html

W

Grande peczenyj, to com um problema bem parecido, to tentando executar este comando, porem ele pede senha e nao consigo enviar a senha.

EXECUTAR DO WINDOWS XP - SP3

RUNAS /user:administrador notepad.exe

public static void main(String args[]) {
        try {
            Runtime cmd = Runtime.getRuntime();
            Process processo = cmd.exec("RUNAS /user:administrador \"netsh interface ip set address name=\"local\" source=dhcp\"");
            byte[] senha = new byte[]{'s', 'e', 'n', 'h', 'a'};
            /*processo.getOutputStream().write(senha);*/ TESTE 1
            /*processo.getInputStream().read(senha);*/ TESTE 2
            Scanner ler = new Scanner(processo.getInputStream());
            System.out.println(ler.nextLine().toString());
        } catch (IllegalAccessError e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

com os dois metodos, ele cai na tela de senha e fica guardando a entrada da senha.

Ao tentar

Runtime.getRuntime().exec(cmd);
Runtime.getRuntime().exec(senha);
/*-- O MESMO COM--*/
processo = cmd.exec("RUNAS /user:administrador \"netsh interface ip set address name=\"local\" source=dhcp\"");
processo = cmd.exec("senha");

ele fica como 2 comandos independentes (se bem que parece logico ja que to setando duas vezes, nao axei tipo “processo.executa(comando)” seria perfeito), ai da comando invalido quando tenta passar a senha
tentei passar a como array, String cmd[] = new String[] {“notepad.exe”, “senha”};
mas ainda sim continua executando como comandos separados.

executa ai, se for possivel:

RUNAS /user:administrador notepad.exe

pra ver a tela que cai

Nao consegui entender o “\n” que coloaste na resposta tentei o comando todo no caso de teste

exec(RUNAS /user:administrador notepad.exe \n senha);

ou

byte[] senha = new byte[]{‘s’, ‘e’, ‘n’, ‘h’, ‘a’, ‘\n’};

nao acontece nada
T

http://www.itproexpert.com/post/Runas-via-Script-VBS.aspx

W

Caraca essa é simples e funciona, tem o fato da senha estar exposta no arquivo mas até axar outra maneira eu altero o arquivo via java e dexo a senha na classe que fica mais dificil de alguem conseguir obter.

so pra saber o java nao implementa nada do tipo?Variavel no SHELL igual faz ali no VBS e um SendKey?!

R

Estou com um problema parecido.

quando rodo este comando:
Process p = Runtime.getRuntime().exec(command );

funciona o processo, porem quando abro a janela de processos do Windows ele aparece o nome java.exe, teria como adicionar um parametro para o nome do programa, assim quando eu for ver em processos do windows encontraria xx por exemplo?

ja tentei start “xx” . Dname “xx”
sempre da esse erro java.io.IOException: Cannot run program “start”:
com o Dname não da erro, porem não executa o programa.!

Ruttmann

rreynoud:
Estou com um problema parecido.

quando rodo este comando:
Process p = Runtime.getRuntime().exec(command );

funciona o processo, porem quando abro a janela de processos do Windows ele aparece o nome java.exe, teria como adicionar um parametro para o nome do programa, assim quando eu for ver em processos do windows encontraria xx por exemplo?

ja tentei start “xx” . Dname “xx”
sempre da esse erro java.io.IOException: Cannot run program “start”:
com o Dname não da erro, porem não executa o programa.!

Uma coisa é o processo java que chama seu prompt pra executar determinado comando, e outra coisa é o seu prompt propriamente dito.

Tudo roda em cima da VM Java, então sempre que você rodar qualquer aplicação em Java, o que vai constar na listagem de processos são processos Java…

Criado 16 de abril de 2009
Ultima resposta 7 de out. de 2015
Respostas 7
Participantes 6