Runtime.exec(String[] args) e Solaris

No Windows eu posso rodar um comando qualquer utilizando:

Runtime.getRuntime().exec("cmd.exe copy *.* a:");

ou algo do genero. Queria usar o mesmo com no unix, tipo, shell, ou algum comando do genero, qual seria?

Realmente não entendi sua pergunta

Runtime.getRuntime().exec("sh cmd * /dev/floppy"); 

Era isso que você queria saber?

isso mesmo
agora, tem como eu colocar cinquenta comandos em sequencia usando o sh?
acho q num tem muito a ve com java naum neh? por isso q coloquei no basico…

ps: paulo, manda fotos do brasil pra mim, eu vi a foto ai do lado e da mo saudade. vcs reclamam q eu num mando daqui mas vcs q NUNCA mandam
ps2: avisa a dona mama q as fotos da love parade ja tao arrumadas

Vc pode colocar os 50 comandos em um script e chamar o exec assim:

Runtime.getRuntime().exec("sh script.sh");

Eu jah fiz isso, mas faz um tempo, portanto nao eh 100% certeza… mas que dah pra passar o script pro sh como parametro, isso dah!

valeu…

Entoncis, pra mim nao deu certo isso pq um comanto eh o “su - tibco” e ai ele soh executa os comandos seguintes do script apos o su acabar, e como na aplicacao em java eu num jogo mais nada pro outputstream dela, ela nunca acaba

ai fica a questao de como usar o su de um ejito q eu especifique os comandos a serem dados na conexao que o su abrir…

guilherme

[quote=“Guilherme Silveira”]valeu…
e como na aplicacao em java eu num jogo mais nada pro outputstream dela, ela nunca acaba
[/quote]

engano seu…

Quando você faz:

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

você está deixando de pegar um objeto do tipo Process
então faça:

Process p = Runtime.getRuntime().exec("x");
OutputStream os = p.getOutputStream();
InputStream is = p.getInputStream();

Tá ai a resposta do seu problema! É só você ficar escutando o inputstream, e na hora que aparecer “Password:”, você envia a password pro output stream.

Process p = Runtime.getRuntime().exec("su - tibco");
OutputStream os = p.getOutputStream();
InputStream is = p.getInputStream();

Isto nao resolve o problema pois se eu executo este codigo sendo root, a senha nao sera pedida (q eh meu objetivo secundario) mas ai nao consigo executar nenhum outro comando apos o su. Os inputstreams de entrada e saida nao funcionaram comigo pra mandar um comando pos su…
Vo tenta denovo e falo o resultado…

gui

Eu fiz um teste no Linux, e eu peguei tanto a saida padrao do su quanto a saida de erro.

Veja o que deu:

saida padrao: nada
saida de erro: “su: must be run from a terminal”

retornando logo em seguida, e consequentemente não efetuando a mudança de usuário.

Não sei se no Solaris o comportamento é o mesmo, mas se for, talvez seja por isso que não funciona como o esperado.

Eu nao recebo nada na saida de erro, e recebo na saida padrao os dados de uma nova conexao (tipo: Welcome to Solaris 9 bla bla bla bla bla) mas nao me adiantas pq ai eu nao tenho como mandar novos comandos pro processo (o output nao funciona)…

Gui

ta aqui o codigo q funciona parcialmente.
se alguem quiser testar pode ver
meu unico problema ficou sendo como executar comandos em outras maquinas. por exemplo, eu quero executar um ls (ou qq coisa) apos dar um ssh ele nao funciona pq o inputstream nao foi redirecionado… e esse eh o problema atual.
o problema com o su foi razoavelmente bugaiado resolvido com o codigo abaixo, isto eh, eu posso mudar de usuario e mandar ve que funciona…
…se ele nao pedir a senha… isto eh, se voce for root e mudar pra um de nivel mais baixo, senao ele tenta redirecionar os streams e nao funciona denovo…

	/**
	 * Constructor for Test.
	 */
	public Test(String[] args) throws IOException {
		Runtime r = Runtime.getRuntime();
		//for (int i = 0; i != args.length; i++) {
		String i = "cmd";
			System.out.println("[" + i + "] " + "Running: " + args.toString());
			Process proc = r.exec(args);
			new T(proc.getErrorStream(), "ERROR").start();
			new T(proc.getInputStream(), "INPUT").start();
			System.out.println("[" + i + "] " + "Waiting for commands");
			doCommandLineFor(i,proc.getOutputStream());
			System.out.println("[" + i + "] " + "Stopping: " + args.toString());
		//}
	}

	/**
	 * Method doCommandLineFor.
	 * @param i				the program number
	 * @param outputStream		the output stream
	 */
	private void doCommandLineFor(String i, OutputStream outputStream) throws IOException {
		String cmd = "";
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter out = new PrintWriter(outputStream,true);
		while(!cmd.equalsIgnoreCase("end")){
			cmd = in.readLine();
			System.out.println("[" + i + "] " + cmd);
			out.println(cmd);
		}
	}


	public static void main(String[] args)
		throws IOException, InterruptedException {
		new Test(args);
	}

	class T extends Thread {

		InputStream stream = null;
		String code = null;

		public T(InputStream stream,String code) {
			this.stream = stream;
			this.code = code;
		}

		private void parseStream()
			throws IOException {
			InputStreamReader isr = new InputStreamReader(stream);
			BufferedReader br = new BufferedReader(isr);
			String line = null;
			while ((line = br.readLine()) != null) {
				System.out.println(code + ">" + line);
			}
		}

		public void run() {
			try {
				parseStream();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

O Security Manager “sandbox” deve ter impedido de redirecionar o Stream, e faz sentido nao?

Gui
pra reseolver esse problema, utilize algum .jar que faca conexoes SSH… Hoje o ssh1 ta aberto pra fora dos eua, entao acho que nao vai ser problema voce encontrar algo no sourceforge.

Na verdade, eh o su que reclama dos streams, e não o SecurityManager (to viajando?).

O que se pode fazer eh ter um script que se quer rodar como root e chamar (pelo Runtime.exec()) uma linha assim:

su tibco -c script.sh

Seu script tb precisaria de input??

Na verdade, eh o su que reclama dos streams, e não o SecurityManager (to viajando?).

O que se pode fazer eh ter um script que se quer rodar como root e chamar (pelo Runtime.exec()) uma linha assim:

su tibco -c script.sh

Seu script tb precisaria de input??[/quote]
o script precisaria de input sim, o q seria:

su tibco -c script.sh <<EOF
senha
input
EOF

perfeito pro su
preciso descobrir tambem com o ssh como manipul;ar isso

gui

[]

Estou com um problema parecido. Quero rodar o executavel a partir da minha aplicação java. Criei uma interface grafica, escrevo um xml usando a JDom e quero rodar meu projeto, que eh em c++, que faz a leitura desse xml e outras coisas mais.

como posso abrir o terminal e rodar o executavel? ( lembrando que uso linux)

Estou tentando utilizar o comando em uma classe JAVA, chamada por uma pagina JSF:
Process p = Runtime.getRuntime().exec("cmd /c calc"); OutputStream os = p.getOutputStream(); InputStream is = p.getInputStream();

Quando rodo pelo eclipse, funciona!
Quando rodo pelo tomcat, não funciona!, por que? alguem pode me ajudar?