如何使用Java实现ssh命令登录主机执行shell命令

介绍

这篇文章主要介绍如何使用Java实现ssh命令登录主机执行shell命令,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

<强> 1,ssh命令

ssh为Secure shell的缩写,由IETF的网络小组(网络工作小组)所制定;ssh为建立在应用层基础上的安全协议. ssh是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用ssh协议可以有效防止远程管理过程中的信息泄露问题. ssh最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台. ssh在正确使用时可弥补网络中的漏洞. ssh客户端适用于多种平台。几乎所有UNIX平台,包括hp - ux、Linux、AIX、Solaris、数字UNIX, Irix,以及其他平台,都可运行ssh。

实际工作中,我们经常使用客户端工具(比如:安全的CRT, Xshell, MobaXterm等)ssh到主机上,执行一些操作命令。

如何使用Java语言实现ssh连接主机,并执行shell命令呢?

<强> 2,Java实现ssh命令

1)代码实现如下:

进口java.io.BufferedReader;进口java.io.IOException;进口java.io.InputStream;进口java.io.InputStreamReader;进口java.io.UnsupportedEncodingException;进口java.util.Calendar;进口org.apache.commons.lang3.StringUtils;进口ch.ethz.ssh3.Connection;进口ch.ethz.ssh3.Session;进口ch.ethz.ssh3.StreamGobbler;公共类SshUtil{私有静态字符串DEFAULT_CHAR_SET=癠TF-8";私有静态字符串tipStr=?======================% s=======================?;私有静态字符串splitStr=?====================================================?;,/* * *登录主机,* @return, *,登录成功返回真,否则返回假,*/公共静态连接登录(ip的字符串,字符串的用户名,字符串密码){,布尔isAuthenticated=false;康涅狄格州,连接=零;长,开始时间=Calendar.getInstance () .getTimeInMillis ();试着{大敌;康涅狄格州=新连接(ip);,conn.connect ();//连接主机,isAuthenticated=conn.authenticateWithPassword(用户名、密码);//认证,如果(isAuthenticated) {,System.out.println(字符串。格式(tipStr“认证成功“));,}{,其他System.out.println(字符串。格式(tipStr“认证失败“));,},}捕捉(IOException e) {,System.err.println(字符串。格式(tipStr“登录失败“));,e.printStackTrace ();长,}endTime=Calendar.getInstance () .getTimeInMillis ();,System.out.println(“登录用时:“+ (endTime -开始时间)/1000.0 +“s \ n"+ splitStr);康涅狄格州,返回;},/* *,*远程执行shell脚本或者命令,* @param cmd, *,即将执行的命令,* @return, *,命令执行完后返回的结果值,*/公共静态字符串执行(连接康涅狄格州,字符串cmd){,字符串的结果=?”;会话,会话=零;试着{大敌;如果(康涅狄格州!=null) {,,会话=conn.openSession ();//打开一个会话,,session.execCommand (cmd);,//执行命令,,结果=processStdout (session.getStdout (), DEFAULT_CHAR_SET);,,//如果为得到标准输出为空,说明脚本执行出错了,,如果(StringUtils.isBlank(结果)){,,System.err.println(“【得到标准输出为空】\ n执行的命令如下:\ n"+ cmd);,,结果=processStdout (session.getStderr (), DEFAULT_CHAR_SET);,其他}{大敌;,System.out.println(“【执行命令成功】\ n执行的命令如下:\ n"+ cmd);,}大敌;},}捕捉(IOException e) {,System.err.println(“【执行命令失败】\ n执行的命令如下:\ n"+ cmd +“\ n"+ e.getMessage ());,e.printStackTrace ();最后,}{,如果(康涅狄格州!=null) {,,conn.close ();,},如果(会话!=null) {,,session.close ();,},},返回结果;}/* *,*解析脚本执行返回的结果集,* @param输入流对象,* @param字符集编码,* @return, *,以纯文本的格式返回,*/私有静态字符串processStdout (InputStream,字符串字符集){,InputStream stdout=new StreamGobbler(的);,StringBuffer缓冲=new StringBuffer ();试着{大敌;BufferedReader br=new BufferedReader(新InputStreamReader (stdout,字符集));,字符串行=零;,在((=br.readLine行())!=null) {,缓冲区。追加(线+“\ n");,},}捕捉(UnsupportedEncodingException e) {,System.err.println(“解析脚本出错:“+ e.getMessage ());,e.printStackTrace ();,}捕捉(IOException e) {,System.err.println(“解析脚本出错:“+ e.getMessage ());,e.printStackTrace ();,}返回buffer.toString ();}公共静态void main (String [] args){,字符串ip=?92.168.123.234";//此处根据实际情况,换成自己需要访问的主机IP,字符串的用户名=皉oot";,字符串密码=皃assword";康涅狄格州=SshUtil连接。登录(ip、用户名、密码);,字符串cmd=癱d/home/miracle&, pwd&, ls&和猫luna.txt";=SshUtil字符串结果。execute(康涅狄格州,cmd);system . out。println (splitStr +“\ n执行的结果如下:\ n"+ + splitStr结果);}}

2)运行结果如下:

=======================认证成功=======================登录用时:0.859 s=====================================================局葱忻畛晒Α恐葱械拿钊缦?cd/home/miracle&, pwd&, ls&猫,卢娜。txt=====================================================执行的结果如下:/home/miracleluna。txtHello,我# 39;m SshUtil。null

如何使用Java实现ssh命令登录主机执行shell命令