日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

SSH(Secure Shell,安全外殼協(xié)議),是專為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性的應(yīng)用層協(xié)議。在日常開發(fā)中,包括登錄遠(yuǎn)程服務(wù)器、遠(yuǎn)程執(zhí)行命令腳本、文件傳輸?shù)龋际褂昧?SSH 協(xié)議的實(shí)現(xiàn)。而 SSHJ 就是 SSH 協(xié)議的一個(gè) JAVA 語言實(shí)現(xiàn),其功能齊全,對 SSH 協(xié)議的特性實(shí)現(xiàn)全面,可以很方便地在代碼中實(shí)現(xiàn) SSH 相關(guān)功能應(yīng)用,值得 Java 開發(fā)者了解使用。

SSHJ - 功能齊全的Java SSH庫

SSH協(xié)議

簡介

SSHJ 是 hierynomus 在 Github 上開源的 Java SSH 庫,項(xiàng)目位于 https://github.com/hierynomus/sshj,目前版本為 v0.29.0。

SSHJ 功能齊全,支持從 known_hosts 文件讀取驗(yàn)證公鑰,支持公鑰、密碼和交互式的驗(yàn)證方式,支持命令、子系統(tǒng)和 Shell Channel,支持本地和遠(yuǎn)程端口轉(zhuǎn)發(fā),支持 SCP 安全拷貝協(xié)議,支持從版本 0 到 3 的完全的 SFTP 安全文件傳輸協(xié)議,支持廣泛的加密、簽名、壓縮等的算法實(shí)現(xiàn)。

SSHJ - 功能齊全的Java SSH庫

SSH協(xié)議和SSHJ庫

安裝

SSHJ 使用方便,可以使用 Maven 添加到項(xiàng)目依賴,在 pom.xml 中添加

<dependency>
  <groupId>com.hierynomus</groupId>
  <artifactId>sshj</artifactId>
  <version>0.29.0</version>
</dependency>

SSHJ 的主要依賴是 SLF4J,另外,一些加密算法可能會(huì)需要 BouncyCastle,而 zlib 壓縮則需要依賴 JZlib。

SSHJ 也可以自行編譯,需要 Java6 及以上環(huán)境,并安裝有 Unlimited strength Java Cryptography Extensions (JCE) 加密擴(kuò)展包,運(yùn)行命令

./gradlew clean build
SSHJ - 功能齊全的Java SSH庫

SSH協(xié)議與SSHJ庫

實(shí)例

SSHJ中的主要接口由 SSHClient 提供,其作為客戶端用于連接 SSH 服務(wù),每次連接都會(huì)生成一個(gè)會(huì)話 session,在一個(gè) session 中進(jìn)行具體操作。我們來看一個(gè)基本的使用例子:

package net.schmizz.sshj.examples;

import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.IOUtils;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.connection.channel.direct.Session.Command;

import java.io.Console;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

/** 執(zhí)行遠(yuǎn)程命令 */
public class Exec {
    private static final Console con = System.console();

    public static void main(String... args)
            throws IOException {
        final SSHClient ssh = new SSHClient();
        ssh.loadKnownHosts();
        ssh.connect("localhost");
        Session session = null;
        try {
            ssh.authPublickey(System.getProperty("user.name"));
            session = ssh.startSession();
            final Command cmd = session.exec("ping -c 1 toutiao.com");
            con.writer().print(IOUtils.readFully(cmd.getInputStream()).toString());
            cmd.join(5, TimeUnit.SECONDS);
            con.writer().print("n** exit status: " + cmd.getExitStatus());
        } finally {
            try {
                if (session != null) {
                    session.close();
                }
            } catch (IOException e) {
                // 處理異常
            }
            
            ssh.disconnect();
        }
    }

}

這是使用 SSHJ 在遠(yuǎn)程服務(wù)器上執(zhí)行命令的例子。首先創(chuàng)建一個(gè) SSHClient,再加載 know_hosts,并連接到 localhost 所在的 SSH 服務(wù)。然后,使用本機(jī)用戶名對應(yīng)的公鑰進(jìn)行 SSH 登錄驗(yàn)證,并啟動(dòng)會(huì)話。成功建立連接后,使用 session 的 exec 接口在 SSH 服務(wù)所在遠(yuǎn)程執(zhí)行了一條 ping 命令,并從遠(yuǎn)程讀取命令行輸出,返回到本地命令行進(jìn)行打印。最終,在完成任務(wù)后,關(guān)閉會(huì)話并斷開連接。以此為基礎(chǔ)可以實(shí)現(xiàn)遠(yuǎn)程命令的程序化實(shí)現(xiàn),把需要手動(dòng)登錄 SSH 并執(zhí)行命令的過程自動(dòng)化。

SSHJ 實(shí)現(xiàn)了 SCP 安全拷貝協(xié)議,用于加密的文件在本地和遠(yuǎn)程之間拷貝復(fù)制。在 SSHClient 連接成功之后,使用 SCPFileTransfer 實(shí)現(xiàn)文件的上傳和下載:

// SCP下載文件
ssh.newSCPFileTransfer().download("test_file", new FileSystemFile("/tmp/"));

// SCP上傳文件
ssh.newSCPFileTransfer().upload(new FileSystemFile(src), "/tmp/");

SSHJ 還實(shí)現(xiàn)了 SFTP 安全文件傳輸協(xié)議。與 SCP 相比,SFTP 可靠性高,可斷點(diǎn)續(xù)傳,支持更加廣泛的遠(yuǎn)程文件操作。SSHJ 中使用 SFTPClient 來作為 SFTP 的客戶端,在 SSHClient 連接成功后,創(chuàng)建 SFTPClient,并使用 put 和 get 進(jìn)行上傳和下載:

// SFTP下載
final SFTPClient sftp = ssh.newSFTPClient();
try {
    sftp.get("test_file", new FileSystemFile("/tmp"));
} finally {
    sftp.close();
}

// SFTP上傳
final SFTPClient sftp = ssh.newSFTPClient();
try {
    sftp.put(new FileSystemFile(src), "/tmp");
} finally {
    sftp.close();
}

利用 SSHJ,我們還就可以很方便地實(shí)現(xiàn)一個(gè)交互式 SSH 客戶端,在本地命令行上實(shí)現(xiàn)對遠(yuǎn)程命令行的交互:

package net.schmizz.sshj.examples;

import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.StreamCopier;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.connection.channel.direct.Session.Shell;
import net.schmizz.sshj.transport.verification.ConsoleKnownHostsVerifier;
import net.schmizz.sshj.transport.verification.OpenSSHKnownHosts;

import java.io.File;
import java.io.IOException;
import net.schmizz.sshj.common.LoggerFactory;

/** 交互式SSH客戶端 */
class RudimentaryPTY {

    public static void main(String... args)
            throws IOException {

        final SSHClient ssh = new SSHClient();

        final File khFile = new File(OpenSSHKnownHosts.detectSSHDir(), "known_hosts");
        ssh.addHostKeyVerifier(new ConsoleKnownHostsVerifier(khFile, System.console()));

        ssh.connect("localhost");
        try {

            ssh.authPublickey(System.getProperty("user.name"));

            final Session session = ssh.startSession();
            try {

                session.allocateDefaultPTY();

                final Shell shell = session.startShell();

                new StreamCopier(shell.getInputStream(), System.out, LoggerFactory.DEFAULT)
                        .bufSize(shell.getLocalMaxPacketSize())
                        .spawn("stdout");

                new StreamCopier(shell.getErrorStream(), System.err, LoggerFactory.DEFAULT)
                        .bufSize(shell.getLocalMaxPacketSize())
                        .spawn("stderr");

                new StreamCopier(System.in, shell.getOutputStream(), LoggerFactory.DEFAULT)
                        .bufSize(shell.getRemoteMaxPacketSize())
                        .copy();

            } finally {
                session.close();
            }

        } finally {
            ssh.disconnect();
        }
    }

}

在這個(gè)例子中,使用了會(huì)話的 startShell 來啟動(dòng)一個(gè)命令行,而不像我們的第一個(gè)例子那樣創(chuàng)建會(huì)話。在此之后,使用 SSHJ 提供的 StreamCopier,進(jìn)行遠(yuǎn)程命令行輸出流的獲取,以及本地輸入流的上傳,從而完成了一個(gè)實(shí)時(shí)交互的 SSH 命令行。

SSHJ - 功能齊全的Java SSH庫

SSH協(xié)議與SSHJ庫

總結(jié)

SSHJ 作為一個(gè)使用 Java 語言實(shí)現(xiàn)的 SSH 庫,其對于 SSH 協(xié)議的實(shí)現(xiàn)十分全面,包含的特性眾多,在其所提供的 SSH 實(shí)現(xiàn)的比較中,SSHJ 對于協(xié)議和算法的實(shí)現(xiàn)覆蓋程度很高,是實(shí)現(xiàn) SSH 協(xié)議相關(guān)代碼邏輯和應(yīng)用的優(yōu)秀選擇。

SSHJ 項(xiàng)目代碼質(zhì)量高,歷經(jīng)數(shù)年的開發(fā),項(xiàng)目一直處于活躍的開發(fā)和維護(hù)狀態(tài);項(xiàng)目代碼量不大,代碼結(jié)構(gòu)設(shè)計(jì)較好,且提供了豐富的使用例子,值得有興趣的開發(fā)者進(jìn)行更進(jìn)一步的學(xué)習(xí)研究和開源貢獻(xiàn)。

分享到:
標(biāo)簽:齊全 功能 SSHJ Java SSH
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定