web-dev-qa-db-ja.com

JavaあるLinuxマシンから別のLinuxマシンにファイルをコピーするコード

JavaリモートのLinuxシステムにファイルをコピーするコードを探しています。scpコマンドを渡すことでRuntime.getRuntime().exec()関数を試しましたが、毎回リモートシステムのパスワードを要求するプログラムを実行しますが、それを避けたいのですが。

私はJschライブラリを調べました-これを使用してリモートシステムにログインできます-しかし、ファイルをリモートシステムにコピーできません。ログインすると、ホストに対してscpを実行できますが、ホストシステムのユーザー名とパスワードが必要になります。ただし、私はリモートシステムの情報しか持っていません。

6
Thushi

あるホストから別のホストにファイルをコピーするには、リモートホストにデーモンが必要であり、アプリケーションレベルのファイル転送プロトコルを実装しています。これは、そのリモートデーモンと通信する言語に関係なく必要です。

Linuxシステムのオプションは次のとおりです。

  • SSH。これには、リモート側にSSHデーモン(たとえばopenssh-server)が必要です。 sshはセキュリティを考慮して設計されているため、パスワードまたは秘密鍵で認証するようにリモートホストを構成する必要があります。ファイルの実際のコピーは、scpユーティリティまたはsshクライアントライブラリを介して行うことができます(jschはその例です)。
  • NFS。リモートホストはデーモン(たとえばsamba)をインストールし、いくつかのファイルを共有します。ローカルコンピューター(cifs-utilsパッケージはそれが可能)は、ローカルファイルシステムにリモートの場所をマウントできます。この方法では、ファイルをローカルにコピーするだけで、ファイルをリモートホストにコピーできます。認証はオプションであり、ファイルはネットワークを介して平文で送信されます。
  • FTP。 FTPサーバーがリモート側にインストールされ、特定のユーザーが特定の場所にアクセスできるように構成されています。次に、任意のFTPクライアントまたはFTPクライアントライブラリ(Apacheプロジェクトのcommons-netライブラリなど)を使用して、リモートFTPサーバーに接続し、ファイルをコピーできます。認証はオプションであり、ファイルはネットワークを介して平文で送信されます。

ほとんどすべてのシステムですぐに実装および構成できる単一の広く採用され、標準化されたプロトコルがないため、これらすべては多くの作業のように見えます。

2
hellodanylo

このコードスニペットを使用して、ファイルを別のlinuxマシンにコピーできます。

JSch jsch = new JSch();
Session session = null;
session = jsch.getSession("username","hostname",22);
session.setPassword("password");
session.setConfig("StrictHostKeyChecking", "no");
    session.connect();
ChannelSftp channel = null;
channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
    File localFile = new File("localfilepath");
    //If you want you can change the directory using the following line.
    channel.cd(RemoteDirectoryPath)
channel.put(new FileInputStream(localFile),localFile.getName());
    channel.disconnect();
session.disconnect();

これで、ssh-keygenを使用して生成されたリモートシステムに公開鍵を追加しました。したがって、プログラムを実行するたびにパスワードを要求することはありません。

6
Thushi