リモートLinuxシステムにファイルをコピーするためのJavaコードを探しています。私は動作するようにコマンドをRuntime.getRuntime().exec()
渡そうとしましたが、プログラムを実行するたびにリモートシステムパスワードを要求します。scp
私はこのような状況を避けたい。
このライブラリを見ましたJsch
。これを使用してリモートシステムにログインできますが、ファイルをリモートシステムにコピーすることはできません。ログイン後にscp
ホストで操作を実行できますが、この場合でもホストシステムのユーザー名とパスワードが必要です。ただし、リモートシステムに関する情報のみがあります。
答え1
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();
このようにして、generateを使用してリモートシステムに公開鍵を追加しましたssh-keygen
。したがって、プログラムを実行するたびにパスワードを要求しません。
答え2
あるホストから別のホストにファイルをコピーするには、一部のアプリケーションレベルのファイル転送プロトコルを実装するリモートホストのデーモンが必要です。これは、リモートデーモンとの通信に使用する言語に関係なく、要件です。
Linuxシステムのオプションは次のとおりです。
- SSH。これには、リモート側にSSHデーモン(openssh-serverなど)が必要です。 SSHはセキュリティ用に設計されているため、パスワードまたは秘密鍵を使用して認証するようにリモートホストを設定する必要があります。実際、ファイルのコピーはscpユーティリティまたはsshクライアントライブラリを介して実行できます(jschはこれの例です)。
- ネットワークファイルシステムリモートホストはデーモン(Sambaなど)をインストールし、いくつかのファイルを共有します。これにより、ローカルシステム(cifs-utilsパッケージがこれを実行する)がローカルファイルシステムにリモートの場所をマウントできます。これにより、ファイルをローカルにコピーしてリモートホストにコピーできます。認証はオプションで、ファイルはネットワーク経由でプレーンテキストで送信されます。
- FTP。 FTPサーバーはリモート側にインストールされ、特定のユーザーが特定の場所にアクセスできるように構成されています。その後、FTPクライアントまたは一部のFTPクライアントライブラリ(Apacheプロジェクトのcommons-netライブラリなど)を使用してリモートFTPサーバーに接続してファイルをコピーできます。認証はオプションで、ファイルはネットワーク経由でプレーンテキストで送信されます。
これはすべて多くの作業のように見え、ほとんどのシステムですぐに実装および構成できる広く採用されている標準化されたプロトコルがないためです。