java 원격 호출 linux 명령이나 스크립트 구현
#cd/opt
#mkdir zmy
# cd zmy
# vim test.sh
키보드 I키, 편집 모드로 이동
echo 'hello'
echo $1
키보드 esc 키, 후 입력: wq 저장 종료
#cat test.sh
#ll(실행 권한 없음)
#chmod +x test.sh
#ls -l
# 스크립트 실행 가능 여부 테스트
#./test.sh world
또는
# sh ./test.sh world
hello 내보내기
world
주:sh-x./test.sh world
디버그에 -x를 추가할 수 있습니다. 실행 과정을 볼 수 있습니다.
~~~~스크립트 생성 성공!
폴더에 권한 추가
chmod 755 -R filename
linux ll, :
-rwx-r--r-- ( 10 ) 。
, chmod , .
2-4 : user
5-7 : group
8-10 : others
:r==> w==> x==>
r=4 w=2 x=1
755 rwxr-xr-x
777 rwxr-rwx-rwx 。
2. 자바 프로그램 실행 스크립트 작성
2.1gradle 도입jar 패키지
compile('org.jvnet.hudson:ganymed-ssh2:build210-hudson-1')
2.2 package com.xxx.travel.admin.util;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import org.apache.commons.lang.StringUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
/**
* Created by zhangmy on 2017/8/10.
*/
public class RemoteShellExecutor {
private Connection conn;
private String ipAddr;
private Integer port;
private String charset = Charset.defaultCharset().toString();
private String userName;
private String password;
public RemoteShellExecutor(String ipAddr, Integer port, String userName, String password, String charset) {
this.ipAddr = ipAddr;
this.port = port;
this.charset = charset;
this.userName = userName;
this.password = password;
}
/**
*
*
* @return
* @throws IOException
*/
public boolean login() throws IOException {
conn = new Connection(ipAddr, port);
conn.connect();
return conn.authenticateWithPassword(userName, password);
}
/**
*
*
* @param inputStream
* @param charset
* @return
*/
public String processStdout(InputStream inputStream, String charset) {
InputStream in = new StreamGobbler(inputStream);
StringBuffer stringBuffer = new StringBuffer();
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, charset));
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line + "
");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return stringBuffer.toString();
}
/**
* ,
*
* @param cmds
* @return
*/
public String exec(String cmds) {
InputStream inputStream = null;
String result = "";
Session session = null;
try {
if (this.login()) {
session = conn.openSession();
session.execCommand(cmds);
inputStream = session.getStdout();
//
result = this.processStdout(inputStream, this.charset);
// , ,
if (StringUtils.isBlank(result)) {
result = processStdout(session.getStderr(), this.charset);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (session != null) session.close();
try {
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
public static void main(String[] args) {
RemoteShellExecutor executor = new RemoteShellExecutor
("192.168.1.200", 22, "root", "xxx", "utf-8");
String result = executor.exec("sh -x /opt/zmy/test.sh zmy");
/*String result = executor.exec("cd /opt;pwd; ls -l");*/
System.out.println(result);
}
}
주:java 프로그램에서 한 번에 여러 개의 명령을 연속적으로 실행하려면 영문 번호로 여러 개의 명령을 구분할 수 있습니다.
참조:
http://blog.csdn.net/u013089991/article/details/52448989
http://blog.csdn.net/freedom2028/article/details/7104131
1. 명령마다 세미콜론 (;) 이 있는 경우구분하면 명령이 연속적으로 실행되고,
2. 모든 명령이 & & 번호로 구분되면 이 명령들은 계속 실행되고, 중간에 잘못된 명령이 존재하면 뒤에 있는 명령을 더 이상 실행하지 않으며, 틀림없이 끝날 때까지 실행합니다.
3. 각 명령이 두 세로줄 (||) 로 구분되어 있고, 명령이 성공적으로 실행될 수 있는 명령을 만났을 때, 명령이 실행을 멈추고, 뒤에 정확한 명령이 있어도 뒤에 있는 모든 명령이 실행되지 않습니다.만약 명령이 처음부터 실행에 실패한다면, ||후의 다음 명령을 실행할 것입니다. 성공적으로 실행할 수 있는 명령이 있을 때까지, 만약 모든 것이 실패한다면, 모든 실패한 명령은 한 번 실행될 것입니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
집 서버 설계 (하드웨어 편)자신의 Redmine이나 ownCloud를 운용하기 위해 사쿠라 VPS, DigitalOcean, OpenShift 등을 놀랐습니다만, 침착 해 왔으므로 현상을 정리하고 싶습니다. 먼저 하드웨어 구성을 정리합니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.