Ganymed SSH-2

Ganymed SSH-2 用标准java (tested on J2SE 1.4.2 and 5.0) 实现了SSH-2 protocol.

It allows one to connect to SSH servers from within Java programs. It supports SSH sessions (remote command execution and shell access), local and remote port forwarding, local stream forwarding, X11 forwarding, SCP and SFTP. There are no dependencies on any JCE provider, as all crypto functionality is included.

Java代码
  1. Connectionconn=newConnection(ServerHost);
  2. booleanisAuthenticated=conn.authenticateWithPassword(toServerUserName,toServerPassword);//支持密码链接和私钥链接(ssh建立无密码链接)
  3. Sessionsess=conn.openSession();
  4. sess.execCommand(command);
  5. sess.getStdout();//返回执行命令后信息
  6. sess.getStderr();//返回错误信息

注意的地方:如果你需要执行多个linux控制台脚本,比如第一个脚本的返回结果是第二个脚本的入参,你必须打开多个Session,也就是多次调用

Session sess = conn.openSession();,使用完毕记得关闭就可以了

实现例子

利用Ganymed SSH-2模拟SSH操作

今天在看SFTP资料时,无意中看到了Ganymed SSH-2,写了个简单demo,通过,感觉挺好用,特记录如之。
简介:
Ganymed SSH-2 for Java is a library which implements the SSH-2 protocol in pure Java (tested on J2SE 1.4.2 and 5.0). It allows one to connect to SSH servers from within Java programs. It supports SSH sessions (remote command execution and shell access), local and remote port forwarding, local stream forwarding, X11 forwarding, SCP and SFTP. There are no dependencies on any JCE provider, as all crypto functionality is included.
    1. @Test
    2. publicvoidtestSsh(){
    3. Stringhostname="192.168.0.1";
    4. Stringusername="root";
    5. Stringpassword="password";
    6. try{
    7. /*Createaconnectioninstance*/
    8. Connectionconn=newConnection(hostname);
    9. /*Nowconnect*/
    10. conn.connect();
    11. System.out.println("connectok");
    12. /*
    13. *Authenticate.IfyougetanIOExceptionsayingsomethinglike
    14. *"Authenticationmethodpasswordnotsupportedbytheserveratthisstage."
    15. *thenpleasechecktheFAQ.
    16. */
    17. booleanisAuthenticated=conn.authenticateWithPassword(username,password);
    18. if(isAuthenticated==false)
    19. thrownewIOException("Authenticationfailed.");
    20. System.out.println("Authenticationok");
    21. /*Createasession*/
    22. Sessionsess=conn.openSession();
    23. sess.execCommand("uname-a");
    24. System.out.println("Hereissomeinformationabouttheremotehost:");
    25. /*
    26. *Thisbasicexampledoesnothandlestderr,whichissometimes
    27. *dangerous(pleasereadtheFAQ).
    28. */
    29. InputStreamstdout=newStreamGobbler(sess.getStdout());
    30. BufferedReaderbr=newBufferedReader(newInputStreamReader(stdout));
    31. while(true){
    32. Stringline=br.readLine();
    33. if(line==null)
    34. break;
    35. System.out.println(line);
    36. }
    37. /*Showexitstatus,ifavailable(otherwise"null")*/
    38. System.out.println("ExitCode:"+sess.getExitStatus());
    39. /*Closethissession*/
    40. sess.close();
    41. /*Closetheconnection*/
    42. conn.close();
    43. }catch(IOExceptione){
    44. e.printStackTrace(System.err);
    45. System.exit(2);
    46. }
    47. }
@Test public void testSsh() { String hostname = "192.168.0.1"; String username = "root"; String password = "password"; try { /* Create a connection instance */ Connection conn = new Connection(hostname); /* Now connect */ conn.connect(); System.out.println("connect ok"); /* * Authenticate. If you get an IOException saying something like * "Authentication method password not supported by the server at this stage." * then please check the FAQ. */ boolean isAuthenticated = conn.authenticateWithPassword(username,password); if (isAuthenticated == false) throw new IOException("Authentication failed."); System.out.println("Authentication ok"); /* Create a session */ Session sess = conn.openSession(); sess.execCommand("uname -a"); System.out.println("Here is some information about the remote host:"); /* * This basic example does not handle stderr, which is sometimes * dangerous (please read the FAQ). */ InputStream stdout = new StreamGobbler(sess.getStdout()); BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); while (true) { String line = br.readLine(); if (line == null) break; System.out.println(line); } /* Show exit status, if available (otherwise "null") */ System.out.println("ExitCode: " + sess.getExitStatus()); /* Close this session */ sess.close(); /* Close the connection */ conn.close(); } catch (IOException e) { e.printStackTrace(System.err); System.exit(2); } }
运行结果:
connect ok
Authentication ok
Here is some information about the remote host:
Linux localhost.localdomain 2.6.22 #1 SMP Wed Aug 13 11:24:59 CST 2008 i686 i686 i386 GNU/Linux
ExitCode: 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java远程访问linux服务器操作 远程执行shll脚本或者命令、上传下载文件 package com.szkingdom.kfit.bank.ccbDirectShortcut.helper; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.SCPClient; import ch.ethz.ssh2.Session; import ch.ethz.ssh2.StreamGobbler; import common.Logger; import org.apache.commons.lang.StringUtils; import java.io.*; import java.util.logging.Level; /** * SCP远程访问Linux服务器读取文件 * User: boyer * Date: 17-12-7 * Time: 下午3:22 * To change this template use File | Settings | File Templates. */ public class ScpClient { //字符编码默认是utf-8 private static String DEFAULTCHART="UTF-8"; protected static org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(ScpClient.class); static private ScpClient instance; private Connection conn; static synchronized public ScpClient getInstance(String IP, int port, String username, String passward) { if (instance == null) { instance = new ScpClient(IP, port, username, passward); } return instance; } public ScpClient(String IP, int port, String username, String passward) { this.ip = IP; this.port = port; this.username = username; this.password = passward; } private String ip; private int port; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } /** * 远程登录linux的主机 * @author Ickes * @since V0.1 * @return * 登录成功返回true,否则返回false */ public Boolean login(){ boolean flg=false; try { conn = new Connection(ip); conn.connect();//连接 flg=conn.authenticateWithPassword(username, password);//认证 } catch (IOException e) { e.printStackTrace(); } return flg; } /** * 下载文件 * @param remoteFile 远程文件地址 * @param localTargetDirectory 本地目录地址 */ public void getFile(String remoteFile, String localTargetDirectory) { try { if(login()){ SCPClient client = new SCPClient(conn); client.get(remoteFile, localTargetDirectory); conn.close(); } } catch (IOException ex) { log.error(ex); } } /** * 上传文件 * @param localFile 本地目录地址 * @param remoteTargetDirectory 远程目录地址 */ public void putFile(String localFile, String remoteTargetDirectory) { try { if(login()){ SCPClient client = new SCPClient(conn); client.put(localFile, remoteTargetDirectory); conn.close(); } } catch (IOException ex) { log.error(ex); } } /** * 上传文件 * @param localFile 本地目录地址 * @param remoteFileName 重命名 * @param remoteTargetDirectory 远程目录地址 * @param mode 默认0600权限 rw 读写 */ public void putFile(String localFile, String remoteFileName,String remoteTargetDirectory,String mode) { try { if(login()){ SCPClient client = new SCPClient(conn); if((mode == null) || (mode.length() == 0)){ mode = "0600"; } client.put(localFile, remoteFileName, remoteTargetDirectory, mode); //重命名 ch.ethz.ssh2.Session sess = conn.openSession(); String tmpPathName = remoteTargetDirectory +File.separator+ remoteFileName; String newPathName = tmpPathName.substring(0, tmpPathName.lastIndexOf(".")); sess.execCommand("mv " + remoteFileName + " " + newPathName);//重命名回来 conn.close(); } } catch (IOException ex) { log.error(ex); } } public static byte[] getBytes(String filePath) { byte[] buffer = null; try { File file = new File(filePath); FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(1024*1024); byte[] b = new byte[1024*1024]; int i; while ((i = fis.read(b)) != -1) { byteArray.write(b, 0, i); } fis.close(); byteArray.close(); buffer = byteArray.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer; } /** * @author Ickes * 远程执行shll脚本或者命令 * @param cmd * 即将执行的命令 * @return * 命令执行完后返回的结果值 * @since V0.1 */ public String execute(String cmd){ String result=""; try { if(login()){ Session session= conn.openSession();//打开一个会话 session.execCommand(cmd);//执行命令 result=processStdout(session.getStdout(),DEFAULTCHART); //如果为得到标准输出为空,说明脚本执行出错了 if(StringUtils.isBlank(result)){ result=processStdout(session.getStderr(),DEFAULTCHART); } conn.close(); session.close(); } } catch (IOException e) { e.printStackTrace(); } return result; } /** * @author Ickes * 远程执行shll脚本或者命令 * @param cmd * 即将执行的命令 * @return * 命令执行成功后返回的结果值,如果命令执行失败,返回空字符串,不是null * @since V0.1 */ public String executeSuccess(String cmd){ String result=""; try { if(login()){ Session session= conn.openSession();//打开一个会话 session.execCommand(cmd);//执行命令 result=processStdout(session.getStdout(),DEFAULTCHART); conn.close(); session.close(); } } catch (IOException e) { e.printStackTrace(); } return result; } /** * 解析脚本执行返回的结果集 * @author Ickes * @param in 输入流对象 * @param charset 编码 * @since V0.1 * @return * 以纯文本的格式返回 */ private 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) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer.toString(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值