この記事では、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)
私のブログをフォローすることを歓迎します、多くのブティックコレクションがあります
- この記事は、出典を示して複製されています(接続を添付する必要があり、テキストのみを複製することはできません):レターブラザーのブログ。
あなたがそれがあなたに役立つと思うなら、私のためにそれを好きにして共有してください!あなたのサポートは私の尽きることのない創造的な動機です!。また、最近、以下のような高品質なコンテンツを出力しておりますので、よろしくお願いいたします。