Java ssh 访问windows/Linux

  Java ssh 访问windows/Linux

工作中遇到的问题:

Java code运行在一台机器上,需要远程到linux的机器同时执行多种命令。原来采用的方法是直接调用ssh命令或者调用plink的命令。

google下java的其他ssh方法,发现有个包。

具体介绍如下:

Ganymed SSH2 for Java is a library which implements the SSH-2 protocol in pure Java.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.

Ganymed SSH2 for Java was first developed for the Ganymed replication project and acouple of other projects at the IKS group at ETH Zurich.

Website: http://www.cleondris.ch/opensource/ssh2/.

给个链接:http://www.cleondris.ch/opensource/ssh2/javadoc/

更多关于ssh协议的介绍可以查看http://www.ietf.org/rfc/rfc4251.txt

包中主要的类:

Package ch.ethz.ssh2

Interface Summary
ChannelConditionContains constants that can be used to specify what conditions to wait for on a SSH-2 channel (e.g., represented by aSession).
ConnectionMonitorConnectionMonitor is used to get notified when the underlying socket of a connection is closed.
InteractiveCallbackAn InteractiveCallback is used to respond to challenges sent by the server if authentication mode "keyboard-interactive" is selected.
ProxyDataAn abstract marker interface implemented by all proxy data implementations.
ServerHostKeyVerifierA callback interface used to implement a client specific method of checking server host keys.
 
Class Summary
ConnectionConnection is used to establish an encrypted TCP/IP connection to a SSH-2 server.
ConnectionInfoIn most cases you probably do not need the information contained in here.
DHGexParametersDHGexParameters object can be used to specify parameters for the diffie-hellman group exchange.
HTTPProxyDataHTTPProxyData object is used to specify the needed connection data to connect through a HTTP proxy.
KnownHostsThe KnownHosts class is a handy tool to verify received server hostkeys based on the information inknown_hosts files (the ones used by OpenSSH).
LocalPortForwarderLocalPortForwarder forwards TCP/IP connections to a local port via the secure tunnel to another host (which may or may not be identical to the remote SSH-2 server).
LocalStreamForwarderLocalStreamForwarder forwards an Input- and Outputstream pair via the secure tunnel to another host (which may or may not be identical to the remote SSH-2 server).
SCPClientA very basic SCPClient that can be used to copy files from/to the SSH-2 server.
SessionSession is a remote execution of a program.
SFTPv3ClientSFTPv3Client represents a SFTP (protocol version 3) client connection tunnelled over a SSH-2 connection.
SFTPv3DirectoryEntrySFTPv3DirectoryEntry as returned by SFTPv3Client.ls(String).
SFTPv3FileAttributesSFTPv3FileAttributes object represents detail information about a file on the server.
SFTPv3FileHandleSFTPv3FileHandle.
StreamGobblerStreamGobbler is an InputStream that uses an internal worker thread to constantly consume input from another InputStream.
 
Exception Summary
HTTPProxyExceptionMay be thrown upon connect() if a HTTP proxy is being used.
SFTPExceptionUsed in combination with the SFTPv3Client.
 

给个例子:

(1) SSH到Linux机器

package ssh;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.*;
public class Basic {
    public static void main(String[] args)
    {
        String hostname ="9.12.175.30";
        String username="root";
        String password="password";
        try{
            //建立连接
            Connection conn= new Connection(hostname);
            System.out.println("set up connections");
            conn.connect();
            //利用用户名和密码进行授权
            boolean isAuthenticated = conn.authenticateWithPassword(username, password);
            if(isAuthenticated ==false)
            {
                throw new IOException("Authorication failed");
            }
            //打开会话
            Session sess = conn.openSession();
            System.out.println("Execute command:/usr/bin/perl /test/discover.pl /test/meps_linux.txt");
            //执行命令
            sess.execCommand("/usr/bin/perl /test/discover.pl /test/meps_linux.txt");
            System.out.println("The execute command output is:");
            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);
            }
            System.out.println("Exit code "+sess.getExitStatus());
            sess.close();
            conn.close();
            System.out.println("Connection closed");
        }catch(IOException e)
        {
            System.out.println("can not access the remote machine");
        }
    }

}

(2) SSH到windows机器:

windows由于没有默认的ssh server,因此在允许ssh之前需要先安装ssh server。

下载freeSSHd

http://www.freesshd.com/?ctt=download

安装
直接执行freeSSHd.exe就可以进行安装了(用户一定要有管理员权限),安装过程中freeSSHd会问你

Private keys should be created. Should I do it now?

这是问你是否需要现在创建私钥,回答是
Do you want to run FreeSSHd as a system service?

这是问你是否希望把freeSSHd作为系统服务启动,回答是之后就安装完成了

配置用户名和密码:

用putty测试连接。

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\WINDOWS\system32>

例子一中需要两行代码进行修改:

String hostname ="localhost";

sess.execCommand("cmd");

输出结果:

set up connections
Begin execute remote commands
The execute command output is:
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

 

如果要在cmd中执行其他命令,如perl

则使用:

sess.execCommand("cmd.exe /c \"perl -V\"");

 

cmd /c dir 是执行完dir命令后关闭命令窗口。

cmd /k dir 是执行完dir命令后不关闭命令窗口。

cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。

cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。

可以用cmd /?查看帮助信息。


说白了感觉java的ssh就是一个client

转载于:https://www.cnblogs.com/Rozdy/p/4281310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值