Java之ganymed执行linux命令-yellowcong
2018-01-11 21:26
316 查看
同类型的远程管理的shell命令的工具有JSch ,和sshxcute 。通过这个ganymed和websocket搞基,可以做一个web的shell访问。第一种方案,用于直接 执行某个脚本,第二种基于流的方式,可以用于做远程的web的shell。
执行后的结果
多线程类,用于打印上面打印的命令,这个线程类,需要传入输入和输出的参数。
http://www.blogjava.net/roymoro/archive/2012/08/12/385318.html
管网地址
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的shellpackage 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/72621372http://www.blogjava.net/roymoro/archive/2012/08/12/385318.html
相关文章推荐
- java Windows下cmd 命令和Linux下shell命令 执行非JDK中的jar包
- 获取Linux执行命令后的PID--管理部署在服务器的Java程序
- java 使用jsch 远程链接linux执行命令
- Java /Jsp 执行操作系统命令 windows/Linux
- java执行linux命令
- java调用windows/Linux/Unix 命令行执行命令的方法--调用ImageMagick的合并图形的命令
- linux 下 java 执行 shell 命令
- 执行文件下载Java 调用 FFMPEG 命令时用 url 作为输入源,Linux 下出现 “no such file or directory” 问题的解决
- 利用java实现可远程执行linux命令的小工具
- 通过Java语言,执行Linux命令并获得反馈数据。--适用于Android系统
- 利用java实现可远程执行linux命令的小工具
- linux 使用 java 程序执行 shell命令
- java使用Runtime.exec执行linux命令重定向或管道问题
- java执行linux命令
- Java调用linux系统shell执行命令
- java远程执行linux命令
- 纯Java通过SSH执行Linux命令的方法及代码
- java执行Linux命令 .
- Java执行Linux命令并返回命令结果
- java 使用jsch 远程链接linux执行命令