您的位置:首页 > 运维架构 > Linux

Java之ganymed执行linux命令-yellowcong

2018-01-11 21:26 316 查看
同类型的远程管理的shell命令的工具有JSch ,和sshxcute 。通过这个ganymed和websocket搞基,可以做一个web的shell访问。第一种方案,用于直接 执行某个脚本,第二种基于流的方式,可以用于做远程的web的shell。

管网地址

https://gitee.com/yellowcong/bos/tree/master/test_ssh/test_ssh


依赖包

<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>


案例一

这种通过直接执行shell的命令方式,比较的爽,但是不适合直接 交互上。

package com.yellowcong.ssh.demo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

/**
* @author yellowcong
* 创建日期:2018/01/11
*
*/
public class Demo {

public static void main(String[] args) throws Exception {
//主机地址
String hostname = "192.168.66.100";
//用户名
String username = "root";
//密码
String password = "yellowcong";

Connection conn = new Connection(hostname);
conn.connect();
boolean isAuthenticated = conn.authenticateWithPassword(
username,password);

if(isAuthenticated) {
System.out.printf("%s登录成功,系统时间%s\r\n",username,new Date().toLocaleString());

Session sess = conn.openSession();

//所执行的命令
//执行命令
sess.execCommand("ifconfig");

//获取读取的信息
InputStream in = new StreamGobbler(sess.getStdout());
BufferedReader reader =new BufferedReader( new InputStreamReader(in));

String line = null;
while((line = reader.readLine()) != null) {
System.out.println(line);
}

//关闭连接
sess.close();
conn.close();
reader.close();
}else {
System.out.println("授权失败");
}
}
}


执行后的结果



基于输出流的方式

这种输出流的方式,多用于websocket和输出流,可以和websocket一起,来搞基,可以做一个web的shell

package com.yellowcong.demo;

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Scanner;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.ConnectionInfo;
import ch.ethz.ssh2.Session;

/**
* 创建日期:2018年1月11日<br/>
* 创建时间:下午8:28:24<br/>
* 创建者 :yellowcong<br/>
* 机能概要:
*/
public class Demo3 {
public static void main(String[] args) {

try {
String hostname = "192.168.100.10";
String username = "root";
String password = "yellowcong";

Session session = null;
Connection conn = null;

System.out.println("connection 122 start...");

// 建立连接
conn = new Connection(hostname, 22);
// 连接
ConnectionInfo info = conn.connect();

//授权
boolean isAuthenticate = conn.authenticateWithPassword(username, password);
if(isAuthenticate){

//打开连接
session = conn.openSession();
//打开bash
session.requestPTY("bash");
//              session.requestPTY("xterm", 90, 30, 0, 0, null);

session.startShell();

//启动多线程,来获取我们运行的结果
//第一个参数  输入流
//第二个参数  输出流,这个直接输出的是控制台
ReadThread is = new ReadThread(session.getStdout(), new PrintStream(System.out));
new Thread(is).start();

//启动线程2,我
ReadThread error = new ReadThread(session.getStderr(), new PrintStream(System.out));
new Thread(error).start();

// 输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(session.getStdin(), "utf-8"));
out.write("ls\n");
out.flush();

//输入命令
out.write("ifconfig\n");
out.flush();

//输出命令
out.write("ip addr\n");
out.flush();

//清空
out.write("clear\n");
out.flush();
}

} catch (Exception e) {
e.printStackTrace();
}

}
}


多线程类,用于打印上面打印的命令,这个线程类,需要传入输入和输出的参数。

package com.yellowcong.demo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;

/**
* 创建日期:2018年1月11日<br/>
* 创建时间:下午8:33:36<br/>
* 创建者 :yellowcong<br/>
* 机能概要:
*/
public class ReadThread implements Runnable {
private InputStream in;
private PrintStream out;
//编码
private String charset = "UTF-8";

//用于暂停的flag
private boolean flag = true;

// 停止线程
public void stopThread() {
flag = false;
}

/**
*
* @param in  输入流,获取的输入
* @param out 输出流
*/
public ReadThread(InputStream in, PrintStream out) {
super();
this.in = in;
this.out = out;
}

public void run() {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(in, charset));

String temp;

//读取数据
while ((temp = br.readLine()) != null && flag == true) {
if (out != null) {
out.println(temp);
out.flush();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


参考文章

http://blog.csdn.net/u013467442/article/details/72621372

http://www.blogjava.net/roymoro/archive/2012/08/12/385318.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: