首页 > 系统相关 >Java ssh 访问windows/Linux

Java ssh 访问windows/Linux

时间:2023-06-27 22:02:05浏览次数:47  
标签:used Java windows cmd server ssh dir SSH


工作中遇到的问题:

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

ChannelCondition

Contains constants that can be used to specify what conditions to wait for on a SSH-2 channel (e.g., represented by aSession).

ConnectionMonitor

ConnectionMonitor is used to get notified when the underlying socket of a connection is closed.

InteractiveCallback

An InteractiveCallback is used to respond to challenges sent by the server if authentication mode "keyboard-interactive" is selected.

ProxyData

An abstract marker interface implemented by all proxy data implementations.

ServerHostKeyVerifier

A callback interface used to implement a client specific method of checking server host keys.

 

Class Summary

Connection

Connection is used to establish an encrypted TCP/IP connection to a SSH-2 server.

ConnectionInfo

In most cases you probably do not need the information contained in here.

DHGexParameters

DHGexParameters object can be used to specify parameters for the diffie-hellman group exchange.

HTTPProxyData

HTTPProxyData object is used to specify the needed connection data to connect through a HTTP proxy.

KnownHosts

The KnownHosts class is a handy tool to verify received server hostkeys based on the information inknown_hosts files (the ones used by OpenSSH).

LocalPortForwarder

LocalPortForwarder 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).

LocalStreamForwarder

LocalStreamForwarder 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).

SCPClient

A very basic SCPClient that can be used to copy files from/to the SSH-2 server.

Session

Session is a remote execution of a program.

SFTPv3Client

SFTPv3Client represents a SFTP (protocol version 3) client connection tunnelled over a SSH-2 connection.

SFTPv3DirectoryEntry

SFTPv3DirectoryEntry as returned by SFTPv3Client.ls(String).

SFTPv3FileAttributes

SFTPv3FileAttributes object represents detail information about a file on the server.

SFTPv3FileHandle

SFTPv3FileHandle.

StreamGobbler

StreamGobbler is an InputStream that uses an internal worker thread to constantly consume input from another InputStream.

 

Exception Summary

HTTPProxyException

May be thrown upon connect() if a HTTP proxy is being used.

SFTPException

Used 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

标签:used,Java,windows,cmd,server,ssh,dir,SSH
From: https://blog.51cto.com/nethub/6566828

相关文章

  • Java中WebService实例
    WebServices是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务。WebService的关键技术和规则:1.XML:描述数据的标准方法.2.SOAP:表示信息交换的协议(简单对象访问协议).3.WSDL:Web服务描述语言.4.UDDI:通用描述、发现与集......
  • Java并发(十二)----线程应用之多线程解决烧水泡茶问题
    1、背景统筹方法,是一种安排工作进程的数学方法。它的实用范围极广泛,在企业管理和基本建设中,以及关系复杂的科研项目的组织与管理中,都可以应用。怎样应用呢?主要是把工序安排好。比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶、茶杯要洗;火已生了,茶叶也有了。怎么办?办法甲......
  • 阿里的Java开发规范插件验证
    阿里最近有点“烦”,但是作为技术人,更多关注的还是技术层面,其他的就交给有关机构和时间来证明。最近有项工作借鉴了阿里的Java开发规范,为了能让其落地,需要验证方案,而这个Java开发规范提供了对应的验证插件,因此从使用层面,了解一下。目前该插件实现了开发手册中的的53条规则,大部分基于......
  • 对第三阶段PTA集训及Java课程的分析与反思
    前言:本阶段PTA集训共有8-11题目集,涵盖了很多知识点,尤其是成绩计算系列题目,几乎包含了Java目前所学的所有内容,写下来非常不容易(可能对于我这种小菜鸡来说很难)。涵盖的知识点包括对Stirng类型的处理,对象数组的创建与处理,抽象类的使用,异常的处理,逻辑的训练,设计模式的实操。题量不大......
  • java-集合类学习
    LinkedHashMapAspecialconstructorisprovidedtocreatealinkedhashmapwhoseorderofiterationistheorderinwhichitsentrieswerelastaccessed,fromleast-recentlyaccessedtomost-recently(access-order).Thiskindofmapiswell-suitedtobu......
  • JAVA判断是否是IDEA里启动
      /***判断是否是idea里面启动*@returntrue:是false:否*/privatestaticbooleancheckRunInIDEA(){try{Class.forName("com.intellij.rt.execution.application.AppMainV2");returntrue;}cat......
  • java8多线程使用示例
    使用CompletableFuture.allOf实现异步执行同步搜集结果/***@authorwjq*@create2022-03-1216:19*/publicclassTestCompleteFuture{privatestaticfinalintcorePoolSize=10;//核心线程数privatestaticfinalint......
  • Java第三阶段题目集总结
    一、前言这一阶段的题目集主要课程成绩设计的迭代,在这一题目里主要用到了正则表达式,准确来说正则表达式在这一题里占据十分重要的位置。这一阶段还考查到了数据结构的内容,像是栈和队列的使用。同时还涉及到了map和set数组的使用。在这一阶段我学到了许多新的知识,也对前面所学的内......
  • Maven构建项目后项目报Error错误Java compiler level does not match the version of
     Maven构建项目后项目报Error错误JavacompilerleveldoesnotmatchtheversionoftheinstalledJavaprojectfac 项目->右键->Properties->ProjectFacets->修改facets中Java版本(下拉箭头出)为要用的版本Maven构建项目需注意1.项目右键->Properties->buildpath->jdk2.项......
  • Java静态导入(import static)需谨慎
    从Java5开始引入了静态导入语法(importstatic),其目是为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。我们先来看一个不使用静态导入的例子,也就是一般导入:publicclassMathUtils{//计算圆面积publicstaticdoublecalCircleArea(doubler){ret......