SFTPプロトコルを使用して、Javaでファイルを安全に転送します

ファイル

この記事では、JavaでSSHベースのファイル転送プロトコル(SFTP)を使用して、ローカルサーバーからリモートサーバーにファイルをアップロードする方法、または2つのサーバー間でファイルを安全に転送する方法について説明します。最初にこれらの契約を見てみましょう

  • SSHは、リモートログインセッションやその他のネットワークサービスにセキュリティを提供するために設計された、より信頼性の高いプロトコルです。例:購入したクラウドサーバーは、ログイン時にsshを使用します。
  • ftpプロトコルは通常、2つのサーバー間でファイルを転送するために使用されますが、本質的に安全ではありません。
  • では、SFTPとは何ですか?SFTPは、安全なネットワークファイル転送プロトコルであるSSH + FTPとして理解できます。

一般的に、SFTPおよびFTPサービスは、対応するクライアントソフトウェアを使用してサービスを提供します。Javaコードでの安全なファイル転送にSFTPプロトコルを使用したい場合は、この記事が役に立ちます。

1.JSch依存関係パッケージをインポートします

次の座標をMavenプロジェクトpom.xmlにインポートします。JSchを使用します。JSchはSFTPプロトコルを対応するAPIにカプセル化して呼び出します。

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

2.ファイル転送–JSchの例

2.1getメソッドとputメソッド

ではJSchサーバー間でファイルを使用putおよびget転送できます。putこのメソッドは、ローカルシステムからリモートサーバーにファイルを転送するために使用されます。

channelSftp.put(localFile, remoteFile);

getこのメソッドは、ファイルをリモートサーバーからローカルシステムにダウンロードします。

channelSftp.get(remoteFile, localFile);

2.2認証にユーザー名とパスワードを使用する

JSch jsch = new JSch();
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);

jschSession.setPassword(PASSWORD);
  • 「/home/zimug/.ssh/known_hosts」はSSHのknown_hostsファイルであり、信頼できるリモートホストの公開鍵保存ファイルです。
  • USERNAMEはユーザー名です
  • REMOTE_HOSTリモートホストIP
  • REMOTE_PORTリモートホストポート
  • PASSWORDリモートホストログインパスワード

2.3。認証に公開鍵と秘密鍵を使用する

読者が公開鍵と秘密鍵の使用法と意味を理解できない場合は、最初にSSHの知識を補足する必要があります。

  • ローカル秘密鍵–/home/登录用户名/.ssh/id_rsa
  • リモート公開鍵のデフォルトの保存場所–~/.ssh/authorized_keys
JSch jsch = new JSch();
jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);

jsch.addIdentity("/home/zimug/.ssh/id_rsa");

2.4完全なJSchファイル転送の例

ローカルシステムからリモートサーバー1.2.3.4ファイルを転送し、認証にSSHパスワードログイン方式を使用します。

import com.jcraft.jsch.*;

public class SFTPFileTransfer {

    private static final String REMOTE_HOST = "1.2.3.4";  //远程主机ip
    private static final String USERNAME = "";  //登录用户名
    private static final String PASSWORD = "";  //登陆密码
    private static final int REMOTE_PORT = 22;   //ssh协议默认端口
    private static final int SESSION_TIMEOUT = 10000; //session超时时间
    private static final int CHANNEL_TIMEOUT = 5000; //管道流超时时间

    public static void main(String[] args) {

        String localFile = "/home/zimug/local/random.txt";   //本地文件路径
        String remoteFile = "/home/zimug/remote/targetfile.txt";   //上传到远程的文件路径,要保证登录用户有写权限

        Session jschSession = null;

        try {

            JSch jsch = new JSch();
            jsch.setKnownHosts("/home/zimug/.ssh/known_hosts");
            jschSession = jsch.getSession(USERNAME, REMOTE_HOST, REMOTE_PORT);

            // 通过ssh私钥的方式登录认证
            // jsch.addIdentity("/home/zimug/.ssh/id_rsa");

            // 通过密码的方式登录认证
            jschSession.setPassword(PASSWORD);
            jschSession.connect(SESSION_TIMEOUT);

            Channel sftp = jschSession.openChannel("sftp");  //建立sftp文件传输管道
            sftp.connect(CHANNEL_TIMEOUT);

            ChannelSftp channelSftp = (ChannelSftp) sftp;

            // 传输本地文件到远程主机
            channelSftp.put(localFile, remoteFile);

            channelSftp.exit();

        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        } finally {
            if (jschSession != null) {
                jschSession.disconnect();
            }
        }
        System.out.println("文件传输完成!");
    }
}

3.JSch例外処理

ファイルのアップロードプロセス中に、次の例外が発生する場合があります

3.1UnknownHostKey例外

リモートサーバーのIPアドレスをknown_hostsファイルに追加する必要があります。

$ ssh-keyscan -t rsa 1.2.3.4 >> ~/.ssh/known_hosts

3.2秘密鍵の無効な例外

リモートサーバーが秘密鍵を再生成した可能性があり、秘密鍵の配布をローカルサーバーにコピーする必要があります。

ssh-copy-id  -i  ~/.ssh/id_rsa.pub  <被分发的服务器ip>

3.3Auth fail例外の場合

提供されたログインパスワードが正しいことを確認してください

com.jcraft.jsch.JSchException: Auth fail
    at com.jcraft.jsch.Session.connect(Session.java:519)
    at com.zimug.io.howto.SFTPFileTransfer.main(SFTPFileTransfer.java:34)

私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります

  • この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ

あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。

おすすめ

転載: blog.csdn.net/hanxiaotongtong/article/details/109020499