Nao conigo executar um comando chmod pela classe Runtime

É isso aí…

[code] comando = “chmod 755 “+FacesUtil.getCurrentDirectory()+“files/”+CaptchaServlet.getSid()+”.sh”;

	Process processo = Runtime.getRuntime().exec(comando);
	
	BufferedReader buffer = new BufferedReader(new InputStreamReader(processo.getErrorStream())); 						
	String erro = ""; 
			
	while((erro = buffer.readLine())!= null){ 
			    
		System.out.println(erro); 
			
	}

[/code]

Olá…
Hummm: Faces.util. … sua aplicação roda num servidor web?
Olha… nunca tentei fazer algo deste tipo, mas imagino que uma aplicação web não teria permissão de alterar arquivos, ou propriedades dos arquivos no servidor web… seria um grande furo de segurança.
Vamos ver se mais alguém já testou algo semelhante.

E que erro ele da, nenhum?!

O chmod ele até consegue, o problema é executar o arquivo…

dei um ls -l e o arquivo aparece com todas as permissões de acesso, inclusive com o usuário que o criou!!! NO CASO root…

mas na hora de executar… nada nem erro na tela… naaada…:slight_smile:

O que pode ser???

Realmente fazer um chmod 777 é algo que não é correto. Mas enfim, vamos ao que interessa, seu código.

Hmm, você está rodando uma aplicação web, pelo que noto, não é? Enfim, chmod 777 apenas o root ou o dono do arquivo pode fazer. Então com qual usuário você está tentando executar tal comando? O java executa o comando com o mesmo usuário que subiu a aplicação.

Exatamento, alem de que não é recomendado subir o JBoss como root, justamente por conta disso.

Eu parametrizei o chmod como 777 só para desencargo de consciência… depois eu ajusto…

O usuário que subiu a aplicação do tomcat é root

não esta faltando um slash ai não ?

comando = "chmod 755 "+FacesUtil.getCurrentDirectory()+"/files/"+CaptchaServlet.getSid()+".sh";  

Testa ai.

Outra coisa… Quando nesse arquivo possui um comando mkdir qualquer, ele executa e funciona belezinha… agora quando eu coloco um comando:

#!/bin/bash
sshpass -p 123scp root@servidor://cte/filial/cuba/cte_dacte_saida/CTe51091076080738003193570010000000074525932157.pdf /opt/apache-tomcat-6.0.14/webapps/

Via runtime você não consegue rodar comando assim direto. O ideal é você usar tudo baseado no bash ou qualquer outro interpretador:

Runtime.getRuntime().exec("sh", "meu comando com meus argumentos")

mas para executar um bash eu tenho que usar o comando “sh” não tenho???

Como voce costuma fazer???

[quote=dahenz]mas para executar um bash eu tenho que usar o comando “sh” não tenho???

Como voce costuma fazer???[/quote]

Exatamente como eu te escrevi acima.

Runtime.getRuntime().exec(“sh”, “sshpass -p 123scp root@servidor://cte/filial/cuba/cte_dacte_saida/CTe51091076080738003193570010000000074525932157.pdf /opt/apache-tomcat-6.0.14/webapps/”);

Como que você consegue passar duas Strings??

Não estou achando o método que aceita esses dois parâmetros… pelo menos um tem que ser um array…

Qual voce utiliza??? Obrigado garcia…

Desculpe:

Runtime.getRuntime().exec(new String[] { "sh", "meu-comando-muito-complexo", "algum-parametro", "outro-parametro" });

Cara… incrível… não funciona…

		Process processoExecute = Runtime.getRuntime().exec(new String[] { "sh", "/opt/apache-tomcat-6.0.14/webapps/cte/files/temp.sh" });		

No código acima fiz os campos fixos com um arquivo de nome fixo, para não ter erro, e executo a página, e nada!!!

Executo o comando aciman no shell, funciona…

Como que pode… bah :?

dahenz, conseguiu executar o comando? Hoje estava lembrando do tópico, por isso a pergunta.

Você conhece o CLI? http://commons.apache.org/cli/

Abraços

Então Garcia… eu abandonei… fiz por ftp mesmo, acho que a JVM restringe qualquer comando de transferência de arquivos pela rede… pois o sh funcionava beleza para criar diretório “mkdir”, mas para fazer o “sshpass” ele passava direto… não executava… E eu tinha os dois comandos no mesmo arquivo…

Então eu parti para transferência por ftp e foi tranquilinho… não me arrependo… hehe

Vou dar uma olhada no link que me passaste!! Valew

Eu não gosto de usar comandos no sistema operacional porque você deixa sua aplicação “nada portável”. Aqui na empresa tem funcionário que usa windows, outro linux… assim podemos rodar os aplicativos em qualquer estação.

Agora entendi que você quer apenas enviar arquivos para outra máquina. Então te indico usar o jakarta commons-net. Se não me engano ele permite fazer FTP over SSL.

Deixa depois teu feedback aqui.

Abraços

Pessoal,

estou com o mesmo problema do dahenz, executo um script shell mas ele não funciona. Meu script deveria executar outros scripts, que executam uma série de processos que rodam paralelamente e por aí vai …

quando executo ele “na mão” ele funciona, quando executo no Java nada …

o mais engraçado, quando sigo os mesmos passos para executar um simples “ls” funciona …

public String exec( ){

        String s = null;

        try {

            Runtime r = Runtime.getRuntime();
            Process p = r.exec("/home2/alan/users/bruno/mcga/run/execute");
            InputStream i = p.getInputStream();
            BufferedReader reader = new BufferedReader( new InputStreamReader(i) );

            s = reader.readLine();
        } catch (Exception e) {
            log.error("Erro ao tentar iniciar o processo: " + e);
        }

        return s;
    }

alguém pode ajudar ?
obrigado

Outra coisa que esqueci de mencionar, ele não “loga” erro nenhum …

e minha aplicação só pode ser executada em Linux