Java 实现 ssh命令 登录主机执行shell命令
Java 实现 ssh命令 登录主机执行shell命令
1、SSH命令
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。
实际工作中,我们经常使用客户端工具(比如:Secure CRT,Xshell,MobaXterm等)SSH到主机上,执行一些操作命令。
如何使用Java语言实现SSH 连接主机,并执行Shell命令呢?
2、Java 实现 SSH命令
1)代码实现如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.Calendar; import org.apache.commons.lang3.StringUtils; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; public class SshUtil { private static String DEFAULT_CHAR_SET = "UTF-8"; private static String tipStr = "=======================%s======================="; private static String splitStr = "====================================================="; /** * 登录主机 * @return * 登录成功返回true,否则返回false */ public static Connection login(String ip, String userName, String password){ boolean isAuthenticated = false; Connection conn = null; long startTime = Calendar.getInstance().getTimeInMillis(); try { conn = new Connection(ip); conn.connect(); // 连接主机 isAuthenticated = conn.authenticateWithPassword(userName, password); // 认证 if(isAuthenticated){ System.out.println(String.format(tipStr, "认证成功")); } else { System.out.println(String.format(tipStr, "认证失败")); } } catch (IOException e) { System.err.println(String.format(tipStr, "登录失败")); e.printStackTrace(); } long endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("登录用时: " + (endTime - startTime)/1000.0 + "s\n" + splitStr); return conn; } /** * 远程执行shell脚本或者命令 * @param cmd * 即将执行的命令 * @return * 命令执行完后返回的结果值 */ public static String execute(Connection conn, String cmd){ String result = ""; Session session = null; try { if(conn != null){ session = conn.openSession(); // 打开一个会话 session.execCommand(cmd); // 执行命令 result = processStdout(session.getStdout(), DEFAULT_CHAR_SET); //如果为得到标准输出为空,说明脚本执行出错了 if(StringUtils.isBlank(result)){ System.err.println("【得到标准输出为空】\n执行的命令如下:\n" + cmd); result = processStdout(session.getStderr(), DEFAULT_CHAR_SET); }else{ System.out.println("【执行命令成功】\n执行的命令如下:\n" + cmd); } } } catch (IOException e) { System.err.println("【执行命令失败】\n执行的命令如下:\n" + cmd + "\n" + e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { conn.close(); } if (session != null) { session.close(); } } return result; } /** * 解析脚本执行返回的结果集 * @param in 输入流对象 * @param charset 编码 * @return * 以纯文本的格式返回 */ private static String processStdout(InputStream in, String charset){ InputStream stdout = new StreamGobbler(in); StringBuffer buffer = new StringBuffer(); try { BufferedReader br = new BufferedReader(new InputStreamReader(stdout, charset)); String line = null; while((line = br.readLine()) != null){ buffer.append(line + "\n"); } } catch (UnsupportedEncodingException e) { System.err.println("解析脚本出错:" + e.getMessage()); e.printStackTrace(); } catch (IOException e) { System.err.println("解析脚本出错:" + e.getMessage()); e.printStackTrace(); } return buffer.toString(); } public static void main(String[] args){ String ip = "192.168.123.234"; // 此处根据实际情况,换成自己需要访问的主机IP String userName = "root"; String password = "password"; Connection conn = SshUtil.login(ip, userName, password); String cmd = "cd /home/miracle&&pwd&&ls&&cat luna.txt"; String result = SshUtil.execute(conn, cmd); System.out.println(splitStr + "\n执行的结果如下: \n" + result + splitStr); } }
2)运行结果如下:
=======================认证成功======================= 登录用时: 0.859s ===================================================== 【执行命令成功】 执行的命令如下: cd /home/miracle&&pwd&&ls&&cat luna.txt ===================================================== 执行的结果如下: /home/miracle luna.txt Hello, I'm SshUtil. Nice to meet you.^_^ =====================================================
3)pom.xml 引用添加如下:
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.9</version> </dependency> <!-- ssh --> <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh2</artifactId> <version>262</version> </dependency>
PS:
关于Maven依赖的 jar包 下载问题,请参考如下博文:
https://www.cnblogs.com/miracle-luna/p/11863679.html
Java 实现 bash命令
https://www.cnblogs.com/miracle-luna/p/12050728.html
Java 实现 ssh命令 登录主机执行shell命令
https://www.cnblogs.com/miracle-luna/p/12050367.html
Java 实现 telnet命令 验证主机端口的连通性
https://www.cnblogs.com/miracle-luna/p/12049658.html
Java 检查IPv6地址的合法性
https://www.cnblogs.com/miracle-luna/p/12041780.html
Java 实现判断 主机是否能 ping 通
https://www.cnblogs.com/miracle-luna/p/12026797.html