【Java】Java执行远程机器上Linux命令
Java  /  管理员 发布于 4年前   539
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 } } }}
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号