Java

用於將文件從一台 linux 機器複製到另一台 linux 機器的 Java 程式碼

  • August 5, 2017

我正在尋找將文件複製到遠端 linux 系統的 java 程式碼。我Runtime.getRuntime().exec()通過傳遞scp命令嘗試了功能,但每次我執行程序時,它都要求輸入遠端系統密碼。我想避免這種情況。

我查看了Jsch庫——使用它我可以登錄到遠端系統——但我無法將文件複製到遠端系統。一旦我登錄,我就可以scp對我的主機進行操作,但它再次需要主機系統使用者名和密碼。但是,我只有遠端系統的資訊。

將文件從一台主機複製到另一台主機需要遠端主機上的守護程序,實現一些應用程序級文件傳輸協議。無論您要與遠端守護程序使用哪種語言,這都是一項要求。

您對 Linux 系統的選擇是:

  • SSH。這需要遠端端的 SSH 守護程序(比如 openssh-server)。因為 ssh 是為安全而設計的,所以您必須配置遠端主機以使用密碼或私鑰對您進行身份驗證。實際上,可以通過 scp 實用程序或 ssh 客戶端庫來複製文件(jsch 就是一個例子)。
  • NFS。遠端主機安裝一個守護程序(例如 samba)並共享一些文件。然後,您的本地電腦(cifs-utils 軟體包能夠做到這一點)可以在本地文件系統上安裝遠端位置。這樣,您只需在本地複製文件即可將文件複製到遠端主機。身份驗證是可選的,文件通過網路以明文形式發送。
  • FTP。ftp 伺服器安裝在遠端端並配置為允許某些使用者訪問某些位置。然後,您可以使用任何 ftp 客戶端或某些 ftp 客戶端庫(例如,來自 Apache 項目的 commons-net 庫)連接到遠端 ftp 伺服器並複製文件。身份驗證是可選的,文件通過網路以明文形式發送。

所有這一切看起來都需要做很多工作,事實上確實如此,因為沒有一個被廣泛採用的標準化協議可以在大多數係統上開箱即用地實施和配置。

您可以使用此程式碼段將文件複製到另一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。所以每次執行程序時它都不會要求輸入密碼。

引用自:https://unix.stackexchange.com/questions/136165