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

article/2025/10/29 8:39:37

SSH是任何一种every-day工具Linux系统管理工作。这是访问网络上的远程计算机,传输数据和执行远程命令的一种简单而安全的方法。除了交互模式之外,还有许多工具可以使依赖于现有技术的远程任务实现自动化ssh服务器/客户端架构。对于这样一种工具,您可以阅读有关在Ubuntu上可以使用例如。您还可以找到ssh客户端的许多实现,但是如何从代码访问ssh提供的功能呢?

JSch是一个用Java实现ssh协议的项目。借助它的帮助,您可以构建能够连接到远程或本地并与之交互的应用程序SSH服务器。这样,您的应用程序就可以管理您本机ssh客户端可以完成的目标计算机的任何方面,这为已经庞大的Java工具集提供了又一强大的功能。

在本文中,我们将把JSch导入我们的Java项目,并开发最少的必要代码段,以创建可以登录到远程计算机的ssh服务器的应用程序,执行一些命令在远程交互式 shell 中,关闭会话,然后显示输出。这个应用程序将是最小的,但是,它可能会提示它提供的功能。

在本教程中,您将学习:

如何将JSch导入Java项目

如何设置测试环境

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

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

b3c6798692a10cfd8fe8a3902fa66782.png

JSch示例执行。

使用的软件要求和约定

软件要求和Linux命令行约定

类别

要求,约定或使用的软件版本

系统

软呢帽30

软件

OpenJDK 1.8,JSch 0.1.55,NetBeans 8.2

其他

以root身份或通过root特权访问Linux系统sudo命令。

约定

#-要求给出linux命令可以直接以root用户身份或通过使用root特权以root特权执行sudo命令$-要求给出linux命令以普通非特权用户身份执行

介绍

在JSch的帮助下,我们将开发一个应用程序,尝试登录到localhost通过ssh,使用用户名test和密码test。我们将假定默认端口22ssh服务器侦听,并且将接受服务器的指纹而不检查其有效性。成功登录后,我们将执行一些命令,这些命令可以在远程Shell中发出,注销,然后打印收到的所有输出。

我们的工具将包括Fedora桌面(作为客户端和服务器),最新的NetBeans IDE和(在撰写本文时)最新的稳定JSch。但是请注意,这些只是选择的工具。 Java是platform-independent,目标服务器可以在地球的另一端,并且可以是任何运行适当操作系统的操作系统ssh server。

设置测试环境

我们需要以上凭证才能进行localhost。在我们的示例中,这意味着我们需要一个名为”test”且密码为”test”的用户。我们还需要一个正在运行的ssh服务器。

添加测试用户

我们将执行useradd如root:

# useradd test

并设置新用户的密码:

# passwd test

在这里,我们需要提供两次以上的密码。这适用于临时的环境,也是外界无法访问的测试环境,但是在极有可能不受控制的访问时,请勿使用容易猜到的密码。

检查SSH服务器

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

# systemctl status sshd

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

# systemctl start sshd

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

测试与本机客户端的连接

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

$ ssh test@localhost

我们需要接受主机的指纹并提供密码。如果到了 shell ,我们的测试环境就完成了。

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

下载档案

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

在NetBeans中创建项目

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

6cf2452c0b05b09ceaf4855678f66002.png

创建新项目。

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

e02f6a64e4c0c02bdc2fc90c8c3c5955.png

选择项目的类别。

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

cddbb2d539e73469f85c12254b0aab90.png

命名项目。

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

8e3b032a2638e1a854d6aab2b6ccdad4.png

将JAR添加为库。

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

a889de0811f1894ca47cf16164141bb2.png

JSch导入成功。

我们需要实施UserInfo界面以便在我们的应用程序中使用它。为此,我们需要添加一个新java class在我们的right-clicking到我们的项目sshremoteexample在项目窗口中,选择”New”,然后选择“ Java Class …”。

b7cf187a96361183edb401990a6a8a10.png

将新的Java类添加到包中。

我们将提供名称”sshRemoteExampleUserinfo”作为类名。

6f9b50312e49d268b156b791a7847346.png

命名新的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) {

}

}

我们的主要班级将是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());

}

}

}

请注意,在此示例中,我们hard-code连接所需的每个详细信息:目标主机名,用户名/密码以及要在远程会话中执行的命令字符串。这几乎不是现实生活中的示例,但它可以达到演示目的。

我们可以更改目标和凭据以在远程主机上执行命令。还要注意,远程会话将具有登录用户的特权。我不建议使用具有高特权的用户-例如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命令连接到远程机器并与之交互,处理输出并以编程方式确定下一步操作的能力。想象一下一个multi-threaded应用程序,该应用程序本身可以管理数百个服务器,您将获得图片。


http://chatgpt.dhexx.cn/article/wD7FMEK5.shtml

相关文章

java jsch执行脚本_JSch远程执行脚本

JSch远程执行脚本 2017-02-24 在自动化测试的时候,需要远程操控服务器做一些操作,比如切日、起服务器、执行某些脚本。如何实现? 我们可以利用JSch,远程执行脚本。JSch是Java Secure Channel的缩写,是一个SSH2功能的纯…

JSch基本使用

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。 欢迎跳转到本文的原文链接:https://honeypps.com/java/jsch-quick-start/ JSch 是SSH2的一个纯Ja…

基于 JSch 实现服务的自定义监控解决方案

一、基于 JSch 实现服务的自定义监控 JSch 是 SSH2 的一个纯 Java 实现。它允许你连接到一个 sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。 既然可以通过 SSH 连接到服务器,那就可…

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

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

使用JSCH连接Linux系统并执行命令

一、关于JSCH技术的简单描述 JSCH是SSH的一个纯Java实现。说直白点,就是一个远程连接你其他Linux或者Unix服务器的一个java代码包。其实就是我们使用jsch这个jar包来方便我们编写代码来连接自己linux系统的。 SSH:是目前较可靠,专为远程登录…

【实用技巧篇】JSch使用介绍,实用JSch实现文件传输

文章目录 JSch使用介绍1. jar包下载2. 引入依赖3. 代码实现4. 验证 JSch使用介绍 JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中。 1. jar包下载…

Jsch网络工具包的使用及源码简析

一、背景 最近,导师安排了些看论文文献并整理论文至文件服务器的工作,在实验的过程中,我们知道常见的上传文件至服务器有以下方式。 ftp/sftp协议进行上传ssh连接,并通过scp命令进行上传通过xftp、xshell、ftplina等图形化工具上…

JSch学习笔记

JSch笔记 第 1 章 JSch简介 1.1 简述 1)jsch是ssh2的一个纯Java实现。它允许你连接到一个sshd服务器,使用端口转发、X11转发、文件传输等。 2)SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。 3)…

OrmLite For Android 学习笔记 之一 Ormlite 介绍及使用

Android 自带的数据库是SQLite,这种数据库适合用于于小型设备中。在实际使用数据库的应用中,我们经常需要把数据库记录转换为 业务对象实体。在桌面应用或者web应用中我们有很多成熟的ORM工具。Android本身没有提供这么一种工具。 Ormlite 是一种ORM工具…

OrmLite 数据库使用大全

本文介绍OrmLite的数据库表的使用以及在项目中选择他的原因。 1. 选用 OrmLite 数据库的原因 目前用的最多的就是GreenDAO 和 OrmLite 了,两者各有优缺点。 GreenDAO 性能高,号称Android最快的关系型数据库;内存占用较小;支持数…

Android ORM数据库之OrmLite使用框架及源码分析

一、简介 OrmLite是一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机率。  首先可以去它的官网看看www.ormlite.com,它的英文全称是Object Relational Mapping&am…

ORMLite完全解析(一)通过实例理解使用流程

在android中使用原始的SQLiteOpenHelper操作数据库显得过于繁琐,而且对于不是很熟悉数据库操作的人来说比较容易出现一些隐藏的漏洞。所以一般都会想到使用相关的ORMLite框架完成开发,类似于J2EE开发中的Hibernate和Mybatis等等,在提高开发效…

Android数据库ORMlite框架

前言 由于第二章是整个文档的核心,内容也很多,所以分次翻译。下一章的内容会继续本章接着翻译。 ------------------------------------------------------------------------------------- 2 如何使用 这一章进入到更多详细地使用ORMLite的各种功能。 2…

Ormlite 介绍 一

概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具。 官方网站:http://ormlite.com/ 如果需要开发android,只需要下载core和android两个jar包: ORMlite的使用 1,建立映射关系 Ormlite与数据库…

ormlite介绍一

概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具。 官方网站:http://ormlite.com/ 如果需要开发android,只需要下载core和android两个jar包&#xff…

Lite-Orm数据库

1. 初步认识 GItHub库 自动化且比系统自带数据库操作快1倍! LiteOrm是android上的一款数据库(ORM)框架库。速度快、体积小、性能高。开发者基本一行代码实现数据库的增删改查操作,以及实体关系的持久化和自动映射。 2.导入orm相…

Android 数据库框架ormlite 使用精要

Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机率。 ormlite是什么? 首…

ormlite 的简单应用

在android开发中还有哪些技术可以方便的操作数据库,我不大清楚,今天学习了一下 ormlite,觉得还不错,非常方便。 ormlite官网下载:http://ormlite.com/releases/ 1、引入jar包 2、写实体类 package com.example.aandr…

OrmLite for android--Ormlite的大概介绍

Ormlite 是一种ORM工具,并且是一种轻量级别的工具。我们可以使用它来对Android中内嵌的sqlite数据库进行相关的操作。Android 的应用程序应使用 Ormlite for android 版本来进行相关的开发。Ormlite for android 提供两个jar库:ormlite-android-4.22.j…

Ormlite 介绍 一

概述 ORMlite是类似hibernate的对象映射框架,主要面向java语言,同时,是时下最流行的android面向数据库的的编程工具。 官方网站:http://ormlite.com/ 如果需要开发android,只需要下载core和android两个jar包&#xff…