Java プログラミング言語を介して scp 転送を実行する最良の方法は何ですか? JSSE、JSch、または弾む城のJavaライブラリを介してこれを実行できるようです。これらの解決策はどれも簡単な答えではないようです。
15 に答える
最終的にJschを使用することになりました。これは非常に簡単で、スケールアップもうまくいったようです (数分ごとに数千のファイルを取得していました)。
こちらをご覧ください
これが Ants の SCP タスクのソース コードです。「execute」メソッドのコードは、その要点です。これにより、何が必要かについての公正なアイデアが得られるはずです。それは私が信じているJSchを使用しています。
または、この Ant タスクを Java コードから直接実行することもできます。
これは高度なソリューションであり、再発明する必要はありません。早くて汚い!
1)まず、http://ant.apache.org/bindownload.cgiにアクセスして、最新の Apache Ant バイナリをダウンロードします。(最近では、apache-ant-1.9.4-bin.zip)。
2)ダウンロードしたファイルを解凍し、JAR ant-jsch.jar (「apache-ant-1.9.4/lib/ant-jsch.jar」) を見つけます。この JAR をプロジェクトに追加します。また、ant-launcher.jar および ant.jar。
3) Jcraft jsch SouceForge プロジェクトに移動し、jar をダウンロードします。現在、jsch-0.1.52.jar . また、この JAR をプロジェクトに追加します。
これで、ネットワーク経由でファイルをコピーするAnt Classes Scpや、SSH サーバーでコマンドを実行する SSHExecを Java コードに簡単に使用できますか。
4)コード例 Scp:
// This make scp copy of
// one local file to remote dir
org.apache.tools.ant.taskdefs.optional.ssh.Scp scp = new Scp();
int portSSH = 22;
String srvrSSH = "ssh.your.domain";
String userSSH = "anyuser";
String pswdSSH = new String ( jPasswordField1.getPassword() );
String localFile = "C:\\localfile.txt";
String remoteDir = "/uploads/";
scp.setPort( portSSH );
scp.setLocalFile( localFile );
scp.setTodir( userSSH + ":" + pswdSSH + "@" + srvrSSH + ":" + remoteDir );
scp.setProject( new Project() );
scp.setTrust( true );
scp.execute();
openssh プロジェクトには、いくつかの Java の代替案がリストされています。Trilead SSH for Javaは、あなたが求めているものに合っているようです。
Zehonと呼ばれるSCPを持つこのSFTPAPIを使用します。これは素晴らしいので、多くのサンプルコードで簡単に使用できます。こちらがサイトhttp://www.zehon.comです。
ここにあるいくつかのように、JSch ライブラリのラッパーを作成することになりました。
これは way-secshell と呼ばれ、GitHub でホストされています。
https://github.com/objectos/way-secshell
// scp myfile.txt localhost:/tmp
File file = new File("myfile.txt");
Scp res = WaySSH.scp()
.file(file)
.toHost("localhost")
.at("/tmp")
.send();
フォルダーを再帰的にコピーする必要があります。さまざまなソリューションを試した後、最終的に ProcessBuilder + expect/spawn で終了します
scpFile("192.168.1.1", "root","password","/tmp/1","/tmp");
public void scpFile(String host, String username, String password, String src, String dest) throws Exception {
String[] scpCmd = new String[]{"expect", "-c", String.format("spawn scp -r %s %s@%s:%s\n", src, username, host, dest) +
"expect \"?assword:\"\n" +
String.format("send \"%s\\r\"\n", password) +
"expect eof"};
ProcessBuilder pb = new ProcessBuilder(scpCmd);
System.out.println("Run shell command: " + Arrays.toString(scpCmd));
Process process = pb.start();
int errCode = process.waitFor();
System.out.println("Echo command executed, any errors? " + (errCode == 0 ? "No" : "Yes"));
System.out.println("Echo Output:\n" + output(process.getInputStream()));
if(errCode != 0) throw new Exception();
}
他のサーバーよりもはるかに簡単な scp サーバーを作成しました。Apache MINA プロジェクト (Apache SSHD) を使用して開発しています。ここで見ることができます: https://github.com/boomz/JSCP
また、jar ファイルを/jar
ディレクトリからダウンロードすることもできます。使い方?見てみましょう: https://github.com/boomz/JSCP/blob/master/src/Main.java