자바 원 격 으로 셸 스 크 립 트 를 호출 하고 출력 정 보 를 가 져 옵 니 다[추천]

1.의존 도 추가

<dependency>
  <groupId>ch.ethz.ganymed</groupId>
  <artifactId>ganymed-ssh2</artifactId>
  <version>262</version>
</dependency>
<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>
2、Api 설명
먼저 연결 기 를 만들어 로그 인 할 ip 주 소 를 입력 합 니 다.Connection conn = new Connection(ipAddr);로그 인 목적 서버 를 모 의 하여 사용자 이름과 비밀 번 호 를 입력 합 니 다.

boolean isAuthenticated = conn.authenticateWithPassword(userName, passWord);
이것 은 불 값 을 되 돌려 줍 니 다.true 는 목적 서버 에 성공 적 으로 로그 인 하지 않 으 면 로그 인 에 실 패 했 습 니 다.
session 을 열 고 필요 한 Liux 스 크 립 트 명령 을 실행 합 니 다.

Session session = conn.openSession();
session.execCommand(“ifconfig”);
대상 서버 의 콘 솔 을 받 아 결 과 를 되 돌려 주 고 br 의 내용 을 읽 습 니 다.

InputStream stdout = new StreamGobbler(session.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout));
스 크 립 트 실행 성공 여 부 를 표시 합 니 다:0-성공 비 0-실패

System.out.println(“ExitCode: ” + session.getExitStatus());
session 과 connection 닫 기

session.close();
conn.close();
Tips:
두 번 째 인증 에 성공 하면 현재 디 렉 터 리 는/home/username/디 렉 터 리 아래 에 있 습 니 다.스 크 립 트 파일 이 있 는 절대 경 로 를 지정 하거나 cd 를 통 해 스 크 립 트 파일 이 있 는 디 렉 터 리 로 탐색 한 다음 스 크 립 트 를 실행 하 는 데 필요 한 인 자 를 전달 하여 스 크 립 트 호출 을 완료 할 수 있 습 니 다.
스 크 립 트 를 실행 한 후에 스 크 립 트 가 실 행 된 결과 텍스트 를 가 져 올 수 있 습 니 다.이 텍스트 들 을 정확하게 인 코딩 한 후에 클 라 이언 트 에 게 되 돌려 서 코드 가 흐 트 러 지지 않도록 해 야 합 니 다.
만약 에 여러 개의 Liux 콘 솔 스 크 립 트 를 실행 해 야 한다 면 첫 번 째 스 크 립 트 의 반환 결 과 는 두 번 째 스 크 립 트 의 입 참 이다.여러 개의 Session 을 열 어야 한다.즉,여러 번 호출Session sess = conn.openSession();,을 사용 하고 닫 으 면 된다.
3.인 스 턴 스:도구 클래스

public class SSHTool {
  private Connection conn;
  private String ipAddr;
  private Charset charset = StandardCharsets.UTF_8;
  private String userName;
  private String password;
  public SSHTool(String ipAddr, String userName, String password, Charset charset) {
    this.ipAddr = ipAddr;
    this.userName = userName;
    this.password = password;
    if (charset != null) {
      this.charset = charset;
    }
  }
  /**
   *     Linux  
   *
   * @return       
   */
  private boolean login() {
    conn = new Connection(ipAddr);
    try {
      //   
      conn.connect();
      //   
      return conn.authenticateWithPassword(userName, password);
    } catch (IOException e) {
      e.printStackTrace();
      return false;
    }
  }
  /**
   *   Shell     
   *
   * @param cmds      
   * @return       
   */
  public StringBuilder exec(String cmds) throws IOException {
    InputStream in = null;
    StringBuilder result = new StringBuilder();
    try {
      if (this.login()) {
        //       
        Session session = conn.openSession();
        session.execCommand(cmds);
        in = session.getStdout();
        result = this.processStdout(in, this.charset);
        conn.close();
      }
    } finally {
      if (null != in) {
        in.close();
      }
    }
    return result;
  }
  /**
   *           
   *
   * @param in        
   * @param charset    
   * @return       
   */
  public StringBuilder processStdout(InputStream in, Charset charset) throws FileNotFoundException {
    byte[] buf = new byte[1024];
    StringBuilder sb = new StringBuilder();
//    OutputStream os = new FileOutputStream("./data.txt");
    try {
      int length;
      while ((length = in.read(buf)) != -1) {
//        os.write(buf, 0, c);
        sb.append(new String(buf, 0, length));
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return sb;
  }
  public static void main(String[] args) throws IOException {
    SSHTool tool = new SSHTool("192.168.100.40", "root", "123456", StandardCharsets.UTF_8);
    StringBuilder exec = tool.exec("bash /root/test12345.sh");
    System.out.println(exec);
  }
}
총결산
위 에서 말 한 것 은 소 편 이 소개 한 자바 원 격 으로 셸 스 크 립 트 를 호출 하고 출력 정 보 를 얻 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 메 시 지 를 남 겨 주세요.소 편 은 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기