java 원격 호출 linux 명령이나 스크립트 구현

5356 단어 서버JAVA 기반
1.xshell 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. 각 명령이 두 세로줄 (||) 로 구분되어 있고, 명령이 성공적으로 실행될 수 있는 명령을 만났을 때, 명령이 실행을 멈추고, 뒤에 정확한 명령이 있어도 뒤에 있는 모든 명령이 실행되지 않습니다.만약 명령이 처음부터 실행에 실패한다면, ||후의 다음 명령을 실행할 것입니다. 성공적으로 실행할 수 있는 명령이 있을 때까지, 만약 모든 것이 실패한다면, 모든 실패한 명령은 한 번 실행될 것입니다

좋은 웹페이지 즐겨찾기