Classe java não roda como root na injeção a um .sh no ubuntu

Boa galera,
Estou desenvolvendo uma aplicação no ubuntu e preciso que uma classe .java rode um arquivo.sh no diretório home/~/.

Oque percebi é que a classe não tem permissão para tal ação,o fato é que no terminal eu rodo de boa com sudo ./arquivo.sh mas no eclipse percebi que não reconhece o sudo.

Tentei colocar permissão de root na classe mas não roda.Percebo q falta alguma permissão a ser concedida para o eclipse…

podem me ajudar nessa!!!
abs!!!

Tens que executar o eclipse como root.

verdade amigo…consegui fazer isso fora do eclipse exportando um jar do projeto…sabe se tem como executar como root dentro do eclipse?
Já tentei dar permissão total ao eclipse e nada.
essa permissão eu concedo a pasta toda ou só ao executável eclipse…
eu usei assim:

$sudo chown root:root eclipse

mas não tentei na pasta toda, deste jeito que fiz travou tudo na compilação!!!

oque estou tendo dificuldade mesmo são com os comando que voltam com a saída de senha…trava tudo cara…sabe como posso capturar elas para poder fazer a autenticação!!!

eu tento ler esse arquivo .sh pela classe java e ele não emite o texto:

$sudo ./idade.sh

já pelo terminal roda de boa

#!/bin/sh
echo -n "Digite sua idade: "
read idade
if [ $idade -lt 18 ];
then
echo “ok”
exit 1
fi

estou observando que minha classe java não está dando opção para escrever no arquivo…
não sei como escrever no arquivo.Sei que existe uma saida como outputstream mas não sei como se implementa

agora mesmo consegui fazer aparecer a autenticação de root no terminal, se eu colocar a senha correta ele tenta seguir para imprimir o texto mas não arranca…se eu errar ele emite 3 tentativas e reativa minha classe java.

segue o código:

Process p = Runtime.getRuntime().exec(new String[]{ “/bin/bash”, “-c”, " sh src/term.sh"});

while ((s = stdInput.readLine())!= null) {

    	   bw.write(s+"\n");
           System.out.println (s);
           //pegar s e enviar para .sh e pegar a resposta de novo
   

       }
       bw.close();

e o .sh:

#!/bin/sh
echo "Digite sua idade: "
read idade

if [ $idade -lt 18 ]; then
echo “Você é menor de idade.”
else
echo “Você é maior de idade.”
fi
al -x bash -c “comando; exec $SHELL”;

está rodando perfeito mas na hora de inserir os dados não entra nada…estou tentando de tudo…tá osso!!!

Após obter o objeto do tipo Process, você precisa disparar uma Thread para ler o output stream e uma para ler o error stream.

Esse bw é um Writer que você obteve de onde?
Você precisa escrever no input stream do objeto Process que obteve ao chamar o Runtime.exec.

Isso tudo é um pouco trabalhoso de se fazer.
Se quiser, pode copiar minha classe Shell do GitHub, ela serve justamente pra facilitar esse tipo de operação.

Exemplo de uso:

Shell shell = new Shell("/bin/bash", "-c", "sh", "src/term.sh");
shell.executeAssinchronous();
PrintWriter  input = shell.getInput();
while ((s = stdInput.readLine()) != null) {
    input.println(s);
    System.out.println(s);
    //pegar s e enviar para .sh e pegar a resposta de novo
}

Cara Muito Show seus exemplos…Adorei brother!!!
vou tirar um tempo para ler a documentação e implementar algo do tipo.

vamos lá:

staroski, eu só consegui imprimir o primeiro echo do arquivo .sh com esse código abaixo.
Tentei com um arrayList inserindo os adds do tipo abaixo e não imprimia o arquivo:

final ArrayList commands = new ArrayList();
commands.add("/bin/bash");
commands.add("-c");
commands.add(command);

        BufferedReader br = null;
		        
        try {                        
            final ProcessBuilder p = new ProcessBuilder(commands);

o código que usei foi esse:

import java.io. *;
import java.util.Scanner;

public class JavaRunCommand extends Shell{

public static void main (String args []) {

   String s = null;

try {

       Process p = Runtime.getRuntime().exec(new String[]{ "/bin/bash", "-c", " sh src/term.sh "});
   
     
	BufferedReader stdInput = new BufferedReader (new 
            InputStreamReader (p.getInputStream ()));


       BufferedReader stdError = new BufferedReader (new 
            InputStreamReader (p.getErrorStream ()));

       //emite um arquivo do tipo (java.io.BufferedReader@7ba4f24f) a cada hora que emite comando
       
  	 BufferedWriter bw= new BufferedWriter( new FileWriter( new File(stdInput.toString())));
  	

       
       while ((s = stdInput.readLine())!= null) {
    	   
    	      
    	   System.out.println (s);
     	   bw.write(s+"\n");      
      
       }
       
       
       bw.close();
       stdInput.close();
       
       while ((s = stdError.readLine ())!= null) {
           System.out.println (s);
       }
       
      System.exit (0);

}catch(IOException r) {

  System.out.println (s);

}
}

}

ela está simples e funcional só não consegue prosseguir com a linha do reade:
echo "Digite sua idade: "
read idade

ele fica travado no echo.
Na verdade estou tentando fazer uma aplicação que se integre ao linux sem precisar depender muito do terminal.Acredito com um pouco mais de esforço conseguiremos…
Se você conseguir algo do tipo que faça esse programa chegar até ao fim nos avise por favor pois não sei até quanto tempo ficarei preso aqui…
abraços…vlw.

Porque você cria um arquivo com o toString do stdInput?

Então você tem que escrever o OutputStream do Process.

Tentou usar a classe Shell que postei?
Ela já trata isso tudo.

BufferedWriter bw= new BufferedWriter( new FileWriter( new File(stdInput.toString())));

Porque você cria um arquivo com o toString do stdInput ?

porque foi um jeito simples de diferenciar o arquivo e ele não sobrescreve o mesmo cria outro…assim faço uma pasta com um log do programa…

staroski…tem como eu te mandar um screen da minha tela para entender oque realmente está acontecendo!!!

não quero escrever dentro do arquivo .sh…quero escrever na saida do read do .sh que eu jogo no console tipo um scanner.nextInt()…
no terminal eu consigo escrever de boa na classe runtime não.

Tu não vai escrever no arquivo.
O input do Process é um objeto do tipo PrintStream justamente pra tu conseguir interagir com o programa que foi disparado.
Ou seja, se tu faz um println é como se tu estivesse digitando no prompt do programa e dando enter.

certo…na real acho que pela lógica se inserimos um
InputStreamReader (p.getInputStream ()));
capturando o runtime(comandos) , só q não estou encontrando
o modo certo de imprimir isso no console.Só uma simples saída
não está funcionando…tentei de tudo e nada cara…
Estou rodando tudo para encontrar esta resposta…
Já fiz de tripa coração e não encontro a saída brother.

O InputStream você usa pra ler as mensagens do programa que foi disparado.

O ErrorStream você usa pra ler as mensagens de erro do programa que foi disparado.

O OutputStream você usa pra enviar algo para o programa que foi disparado.

irmão consegui adaptar um pouco…agora ele imprime a pergunta e uma das respostas da condição do .sh. agora não dá opção de entrada de dados…kkkkkkkkk

tinha razão staroski, consegui implementar oque disse,foi difícil mas graças a DEUS eu consegui.
consegui fazer a saída do processo com getOutputStream().

vlw pelas dicas irmão…tms jnts!!!

Oque achei estranho agora é que depois que conseguir implementar a entrada de dados eu tenho que ficar apertando o ENTER para ler completamente a saída.
Tipo, uma entrada e uma saída,de boa, coloco um int ou String e recebo o read do sh,
mas se tiver muitas linhas de saída, só desce com ENTER.