SSH是访问远程计算机,传输数据和执行远程命令的一种简单而安全的方法。除了基础的交互模式外,还有许多依赖于ssh Client/Server架构的工具可以实现自动化执行远程任务。我们可以找到ssh客户端的许多实现,但是如何从代码编程访问ssh提供的功能呢?本文介绍JAVA语言中使用ssh功能的方法。

JSch是一个用Java实现ssh协议的项目。借助它的帮助,您可以构建应用程序连接到远程或本地SSH服务器并与之交互。这样,您的应用程序就可以使用本机ssh客户端在目标计算机上完成绝大部分功能。

在本文中,我们将把JSch导入Java项目中,并编写少量必要代码来创建一个可以登录到远程计算机的ssh服务器应用程序,在远程交互式 shell 中执行一些命令、关闭会话、然后显示输出。

在本教程中,您将学习:

如何将JSch导入Java项目

如何设置测试环境

如何在自定义类中实现UserInfo接口

如何编写启动交互式ssh会话的应用程序

图:JSch示例执行。

介绍

我们将开发一个基于JSch的JAVA应用程序,它将通过ssh使用用户名test和密码test登录到localhost。我们假定ssh服务器侦听默认端口22,并且接受服务器的指纹而不会检查其有效性。成功登录后,我们将执行一些命令,然后打印收到的所有输出。

我们的工具将包括Fedora桌面(作为客户端和服务器),最新的NetBeans IDE以及(在撰写本文时)最新的稳定版JSch。但是请注意,这些只是选择的工具。 Java是跨平台或者说平台独立的,目标服务器可能在地球的另一端,可以是任何正常运行ssh server的操作系统。

设置测试环境

在示例中,我们需要一个名为"test"的用户,其密码为"test"。我们还需要一个正在运行的ssh服务器。

添加测试用户

我们将以root身份执行useradd:

# useradd test

并设置新用户的密码:

# passwd test

在这里,我们需要提供两次以上的密码。注意:这个简单账号密码适用于临时的环境,最好是外界无法访问的测试环境,如果是在极有可能不受控制的访问时,为了安全起见,请勿使用容易猜到的密码。

检查SSH服务器

我们可以使用systemd检查状态ssh server:

# systemctl status sshd

如果它没有运行,请启动它:

# systemctl start sshd

在台式机上,可能需要执行此步骤,因为其中某些设置在默认情况下不会运行ssh服务器。

测试与本机客户端的连接

如果设置好了用户且该服务正在运行,则我们应该能够使用以上信息登录:

$ ssh test@localhost

我们需要接受主机的指纹并提供密码。如果登陆成功并进入 shell ,那么我们的测试环境就准备好了。

获取并将JSch导入我们的项目

下载文件

为了使用它的功能,我们需要下载JSch项目的字节码。您可以接在JSch主页上找到适当的链接。我们需要.jarJava文件。

在NetBeans中创建项目

首先,我们在NetBeans中创建一个新的空项目,名为sshRemoteExample。我们可以从File菜单中选择"New Project"。

图:创建新项目。

我们将选择"Java"类别和"Java Application"项目。

图:选择项目的类别。

我们需要为项目提供一个名称,在这种情况下为"sshRemoteExample"。

图:命名项目。

在默认布局上,我们可以在左侧找到"Projects"窗口。在新创建的项目下,我们将在"Libraries"上点击鼠标右键,然后选择“添加JAR /文件夹”。将打开一个文件选择器窗口,我们需要在其中浏览从开发者网站下载的.jar文件。

图:将JAR添加为库。

选择之后,如果我们打开"Libraries"节点,则存档应出现在包含的库中。

图:JSch导入成功。

我们需要实现UserInfo接口以便在应用程序中使用它。为此,需要添加一个新java class到项目中:在项目窗口上右键点击sshremoteexample包,选择"New",然后选择“ Java类...”。

图:将新的Java类添加到包中。

我们将以"sshRemoteExampleUserinfo"作为类名。

图:命名新的Java类。

添加源代码

对于我们的接口实现,请考虑以下源码。这是我们盲目接受目标指纹的地方,在现实世界中不要这样做。

package sshremoteexample;

import com.jcraft.jsch.*;

public class sshRemoteExampleUserInfo implements UserInfo {

private final String pwd;

public sshRemoteExampleUserInfo (String userName, String password) {

pwd = password;

}

@Override

public String getPassphrase() {

throw new UnsupportedOperationException("getPassphrase Not supported yet.");

}

@Override

public String getPassword() {

return pwd;

}

@Override

public boolean promptPassword(String string) {

/*mod*/

return true;

}

@Override

public boolean promptPassphrase(String string) {

throw new UnsupportedOperationException("promptPassphrase Not supported yet.");

}

@Override

public boolean promptYesNo(String string) {

/*mod*/

return true;

}

@Override

public void showMessage (String string) {

}

}

Main类是sshRemoteExample,代码如下:

package sshremoteexample;

import com.jcraft.jsch.*;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.nio.charset.StandardCharsets;

public class SshRemoteExample {

public static void main(String[] args) {

String host = "localhost";

String user = "test";

String password = "test";

String command = "hostname\ndf -h\nexit\n";

try {

JSch jsch = new JSch();

Session session = jsch.getSession(user,host, 22);

session.setUserInfo(new sshRemoteExampleUserInfo(user, password));

session.connect();

Channel channel = session.openChannel("shell");

channel.setInputStream(new ByteArrayInputStream(command.getBytes(StandardCharsets.UTF_8)));

channel.setOutputStream(System.out);

InputStream in = channel.getInputStream();

StringBuilder outBuff = new StringBuilder();

int exitStatus = -1;

channel.connect();

while (true) {

for (int c; ((c = in.read()) >= 0);) {

outBuff.append((char) c);

}

if (channel.isClosed()) {

if (in.available() > 0) continue;

exitStatus = channel.getExitStatus();

break;

}

}

channel.disconnect();

session.disconnect();

// print the buffer's contents

System.out.print (outBuff.toString());

// print exit status

System.out.print ("Exit status of the execution: " + exitStatus);

if ( exitStatus == 0 ) {

System.out.print (" (OK)\n");

} else {

System.out.print (" (NOK)\n");

}

} catch (IOException | JSchException ioEx) {

System.err.println(ioEx.toString());

}

}

}

请注意,在此示例中,我们硬编码连接所需的每个详细信息:目标主机名,用户名/密码以及要在远程会话中执行的命令字符串。在正式编程或生产环境,不建议这样用硬编码!

我们可以更改目标和凭据以在远程主机上执行命令。另请注意,远程会话将具有登录用户的特权。我不建议使用具有高特权的用户-例如root。

运行应用程序

我们可以通过单击"Run"菜单中的“运行项目(sshRemoteExample)”,直接在IDE中运行应用程序,该菜单将在源代码下方的输出窗口中提供输出。我们还可以从同一菜单中选择“清理并生成项目(sshRemoteExample)”,在这种情况下,IDE将生成.jarJava归档文件,该文件可以在没有IDE的情况下执行。

提供的输出将显示存档的路径,类似于以下内容(确切的路径可能会因您的IDE设置而异):

To run this application from the command line without Ant, try:

java -jar "/var/projects/sshRemoteExample/dist/sshRemoteExample.jar"

可以猜到,我们可以从命令行运行构建的应用程序,如果一切顺利,它将提供类似于以下内容的输出。

$ java -jar "/var/projects/sshShellExample/dist/sshShellExample.jar"

Last login: Mon Jul 29 14:27:08 2019 from 127.0.0.1

hostname

df -h

exit

[test@test1 ~]$ hostname

test1.linuxconfig.org

[test@test1 ~]$ df -h

Filesystem Size Used Avail Use% Mounted on

devtmpfs 3,9G 0 3,9G 0% /dev

tmpfs 3,9G 127M 3,8G 4% /dev/shm

tmpfs 3,9G 1,7M 3,9G 1% /run

tmpfs 3,9G 0 3,9G 0% /sys/fs/cgroup

/dev/mapper/fedora_localhost--live-root 49G 15G 32G 32% /

tmpfs 3,9G 6,1M 3,9G 1% /tmp

/dev/sdb1 275G 121G 140G 47% /mnt/hdd_open

/dev/sda2 976M 198M 711M 22% /boot

/dev/mapper/fedora_localhost--live-home 60G 50G 6,9G 88% /home

/dev/sda1 200M 18M 182M 9% /boot/efi

tmpfs 789M 9,7M 779M 2% /run/user/1000

tmpfs 789M 0 789M 0% /run/user/1001

[test@test1 ~]$ exit

logout

Exit status of the execution: 0 (OK)

请注意,您的输出可能会在主机名,卷名和大小上有所不同(如果没有其他区别),但总的来说,您应该看到一个完整的df -h输出,跟在普通ssh会话中获得的输出类似。

最后的想法

这个简单的示例旨在以稍微简化的方式展示JSch项目的功能。通过访问测试机和适当的客户端,以下简单命令将提供相同的信息:

$ ssh test@localhost "hostname; df -h"

并且不会创建交互式会话。如果在命令模式下打开通道,JSch将提供相同的功能:

Channel channel = session.openChannel("command");

这样,您无需使用exitShell命令。

该项目的真正力量在于能够通过本机Shell命令连接到远程机器并与之交互,处理输出并以编程方式确定下一步操作的能力。想象一下一个多线程的应用程序,该应用程序通过这种方式可以管理数百个服务器。

java jsch_java - 使用JSch在远程计算机上执行命令相关推荐

  1. java jsch jar_使用JSch从Java在远程计算机上执行命令

    SSH是任何一种every-day工具Linux系统管理工作.这是访问网络上的远程计算机,传输数据和执行远程命令的一种简单而安全的方法.除了交互模式之外,还有许多工具可以使依赖于现有技术的远程任务实现 ...

  2. java jsch 切换用户_如何在java中使用Jsch切换到root用户执行命令?

    我正在尝试通过使用私钥建立的ssh连接执行一组命令.为此我在java中使用了JSCh和Session类. 以下是代码: java.util.Properties config = new java.u ...

  3. spark 读取ftp_scala – 使用ftp在Apache Spark中的远程计算机上读取文件

    我正在尝试使用ftp在Apache Spark( Scala版本)中的远程计算机上读取文件.目前,我在 GitHub上关注Databricks的Learning Spark回购中的一个例子.使用cur ...

  4. 批处理处理远程计算机,使用批处理文件在远程计算机上调整PowerShell窗口的大小...

    这是一个批处理文件,仅使用PowerShell来调用psexec. 使用PowerShell远程处理--- 启动交互式会话要与 单个远程计算机,请使用Enter-PSSession cmdlet.例如 ...

  5. Windows7 连接Windows Server服务器时提示:计算机无法连接到远程计算机上的另一个控制台会话。...

    问题: 使用windows 7远程连接windows 2008 系统时,提示" 计算机无法连接到远程计算机上的另一个控制台会话,原因是您正在运行一个控制台会话" 解决方法: 1.将 ...

  6. 将远程计算机上的文件夹,如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹...

    如何将现有网站上虚拟目录创建到驻留在远程计算机上的文件夹 09/27/2020 本文内容 本文介绍如何将现有网站上虚拟目录创建.测试和删除到驻留在远程计算机上的文件夹. 适用于:  Windows S ...

  7. 计算机无法连接到远程计算机上的另一个控制台会话

    计算机无法连接到远程计算机上的另一个控制台会话 原因是 ip地址错了, 控制自己了.

  8. 无法附加到进程。Visual Studio 2015 远程调试器(MSVSMON.EXE)似乎没有在远程计算机上运行。

    将程序发布到自己本机IIS里,我们进行内部测试,难免会出现bug,可以通过vs进行调试. 步骤:"调试">="附加到进程",如下界面: 找到进程名称为w3 ...

  9. win10手机驱动无法安装,即插即用服务在远程计算机上不可使用,求解决

    win10专业版连接手机无法安装驱动,最后显示即插即用服务在远程计算机上不可使用,求解决的办法!跪谢!!!

最新文章

  1. mysql 导出中间 数据_MYSQL数据库之间的数据导出与导入
  2. 看完就明白锁系列之自旋锁
  3. android EditText监听事件及参数详解
  4. 人工智能导论 王万良教授_学会动态丨辽宁省人工智能导论教学研讨活动在沈阳成功举办...
  5. MATLAB中FFT的使用方法
  6. 如何在SAP Kyma的控制台里扩展新的UI
  7. vue获取编辑器纯文字_前端富文本编辑器 vue-html5-editor
  8. php model get set方法,创建数据库对象之__set方法
  9. 英伟达用GAN生成脑瘤图像,训练出的AI医生,准确率提高16%
  10. USB转RS232驱动怎么安装?
  11. 渗透测试/应急演练过程中metasploit制作木马连接失败问题排查
  12. 电脑计算机快捷键切换桌面,电脑切换界面的快捷键是什么_电脑切换桌面快捷键怎么用-win7之家...
  13. 通俗易懂的通用excel导出
  14. snapchat 登录不上_如何在Snapchat上举报某人
  15. 2020汽车驾驶员(初级)证考试及汽车驾驶员(初级)在线考试
  16. NVIDIA Jetson TK1学习与开发(一):NVIDIA Jetson TK1介绍
  17. 解决网页打开json文件中文乱码情况
  18. Leap Motion开发第一步环境配置
  19. 仔细体验,我想从产品设计的角度分析分析微信的声音锁
  20. uni-app开发的一些情况

热门文章

  1. 配置jupyter连接服务器
  2. 怎样给自己的网站加一个网址,然后让别人访问呢?
  3. 【每日一练】15—CSS实现好看的卡片效果
  4. selenium中三种等待方式:sleep,implicitly_wait,WebDriverWait
  5. (附源码)springboot托育教案系统 毕业设计 224545
  6. 应用统计学(第三版)张建同~学习笔记(大数据专业)
  7. 【Jenkins】定时构建Build periodically-双周日程表配置
  8. 【AHOI2002】哈利●波特与魔法石
  9. 2021SC@SDUSC TencentOS Tiny源码分析(十) 邮箱队列模块一
  10. 说服:瓦解反对和质疑