2017-04-10 7 views
2

여러 서버에서 명령을 실행해야하는 프로그램이 있습니다. Runtime.getRuntime().exec();으로 로컬 테스트를했는데 정상적으로 작동했습니다.Java가 원격 서버에 매개 변수가있는 JAR을 실행합니다.

하지만 원격 명령을 실행하려면 일단 작동하지 않습니다. 예를 들어 내가 할 경우

ssh [email protected] 'touch /tmp/hello.txt' 

내 터미널에서 작동합니다. 그러나 내 자바 프로그램에서 작동하지 않습니다

Runtime.getRuntime().exec("ssh [email protected] 'touch /tmp/hello.txt'"); 

당신이 테스트의 목적에 대한 간단한 main.java에 원격 명령을 실행하는 솔루션 (로그에 대한 필요 및 생산 보안 및 모든)이 있습니까?

감사합니다.

편집는 : 목표는 (로그가 정말 문제가 아니라 더 좋은 것하지 않음)과 같은 매개 변수를 사용하여 JAR를 실행하는 것입니다

귀하의 명령 문자열은 이전 명령 배열로 분할해야
ssh [email protected] 'java -jar -Dbroker-ip=10.20.30.41 -Dtopic=topic -Dpartition-number=32 -Dthread=8 -Dsource=/tmp/hour_moves /opt/Produce.jar > /tmp/logThread1 &' 
+0

bash 스크립트로 명령을 래핑하고 호출 해 보았습니까? –

+0

예, 작동합니다. 그러나 가능한 경우 로컬 서버에 파일을 작성하지 않고이 작업을 수행하려고합니다. – user1484901

+0

나는'Runtime.getRuntime(). exec ("myscript.sh '");'와 같은 것을 실행하는 것을 의미했다. exec()는 Java에서 이상합니다. 나는 항상이 기사로 돌아 간다 : http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html –

답변

1

실행될 수 있습니다. 터미널에서 이것은 쉘에 의해 수행됩니다. 작은 따옴표 문자는 쉘에 특별한 의미가 있습니다. 명령의 배열은 다음과 같이 표시됩니다

cmdarray[0] = "ssh"; 
cmdarray[1] = "[email protected]"; 
cmdarray[2] = "touch /tmp/hello.txt"; 

exec()의 버전이 공백 문자에서 문자열을 분할, 다른 문자열 토크 나이저를 사용합니다. 이제 명령 배열은 다음과 같습니다

cmdarray[0] = "ssh"; 
cmdarray[1] = "[email protected]"; 
cmdarray[2] = "'touch"; 
cmdarray[3] = "/tmp/hello.txt'"; 

그래서 실행 'touch은 원격 서버에서 찾을 수 없습니다.

동의어 : 작은 따옴표를 사용할 필요가 없습니다. 이것은 (두 경우 모두)도 작동합니다 : > 또는 & 같은

ssh [email protected] touch /tmp/hello.txt 

기타 특수 쉘 문자가 원격 사이트 (의 인수로 쉘에 의해 해석하지만 통과하지에 전달하기 위해 터미널에서 탈출해야 ssh 명령). exec()을 사용하는 경우이 문자를 이스케이프 처리 할 필요가 없습니다.

exec()의 반환 유형에 유의하십시오. Process 개체입니다.

Runtime.getRuntime().exec(...).waitFor(); 

을 사용하는 것이 더 좋습니다. 명령이 완료되었는지 확인하십시오.