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

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?

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

Executando no console é assim:

[quote]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:#[/quote]

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:

[code] 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);
}  [/code]

Alguém pode me ajudar?

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

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

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

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?!

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.!

[quote=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.!

[/quote]

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…