Java使用ethz通过ssh2执行远程机器Linux上命令,
封装定义Linux机器的环境信息
package com.tom; import java.io.File; public class Env { private String hostaddr; //Linux机器的IP地址 private Integer port; //SSH访问端口,默认22 private String username; //通过用户名密码访问Linux机器时的用户名 private File pemFile; //通过SSH Key认证时,pemFile包含的是SSH Public Key内容 private String passwd;//通过用户名密码访问Linux机器时的密码 private Authentication authentication; public Env(String hostaddr, Integer port, String username, File pemFile, String passwd, Authentication authentication) { this.hostaddr = hostaddr; this.port = port; this.username = username; this.pemFile = pemFile; this.passwd = passwd; this.authentication = authentication; } public String getHostaddr() { return hostaddr; } public Integer getPort() { return port; } public String getUsername() { return username; } public File getPemFile() { return pemFile; } public String getPasswd() { return passwd; } public Authentication getAuthentication() { return authentication; } }
登录Linxu的认证方式
public enum Authentication { USER_PASSWORD("user-password"), SSH_KEY("ssh-key");//用户名密码方式,ssh-key方式 private String name; Authentication(String name) { this.name = name; } @Override public String toString() { return this.name; } }
package com.tom; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import java.io.*; public class CommandExecutor { private static final String LINE_SEPARATOR = System.getProperty("line.separator"); //Env封装了远程机器的访问信息 //cmd是要执行的shell命令 public static String exec(Env v, String cmd) throws IOException { Connection conn; if (v.getPort() != null) { conn = new Connection(v.getHostaddr(), v.getPort()); } else { conn = new Connection(v.getHostaddr()); } //使用Key认证 //PemFile是ssh public key文件 boolean b = conn.authenticateWithPublicKey(v.getUsername(), v.getPemFile(), v.getPasswd()); if (!b) { throw new IllegalArgumentException(); } Session session = null;//Java进程与Linux建立会话 BufferedReader br = null; try { session = conn.openSession(); session.execCommand(cmd); //执行命令 InputStream stdIn = session.getStdout();//获得命令执行的标准输出 InputStream errIn = session.getStderr(); //获得命令执行的标准错误输出 StringBuilder sb = new StringBuilder("Standard output:").append(LINE_SEPARATOR); br = new BufferedReader(new InputStreamReader(stdIn, "UTF-8")); String str = null; while ((str = br.readLine()) != null) { sb.append(str).append(LINE_SEPARATOR); } br.close(); br = new BufferedReader(new InputStreamReader(errIn, "UTF-8")); sb.append("Error output:").append(LINE_SEPARATOR); while ((str = br.readLine()) != null) { sb.append(str).append(LINE_SEPARATOR); } return sb.toString(); } finally { closeReaders(br); if (session != null) { session.close(); } } } private static void closeReaders(Reader... readers) { if (readers == null) { return; } for (Reader reader : readers) { try { reader.close(); } catch (IOException e) { //Ignore } } } }