java ssh_基于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 引用添加如下:

org.apache.commons

commons-lang3

3.9

ch.ethz.ganymed

ganymed-ssh2

262

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值