Java 實現 SCP 攜帶密碼拷貝文件


Java 實現 SCP 攜帶密碼拷貝文件


 

背景說明

涉及通過程序進行機器間的文件Copy的場景,我們一般會使用ssh連接機器,通過scp命令進行文件copy。

此種方案的前提是:機器間事先要配置免密碼互通

 

但是,如果客戶現場機器數量過多,配置免密操作比較麻煩;或者處於安全考慮,客戶不允許機器之間免密訪問

此時,需要另辟蹊徑,找其他方案實現。

需求場景:提供機器的IP,登錄用戶名、登錄密碼,但是不配置機器間的免密登錄,實現機器之間的文件傳輸。


 

 

Java 實現

1、工具類

ScpUtil.java

package com.miracle.luna.scp; import org.apache.sshd.client.SshClient; import org.apache.sshd.client.session.ClientSession; import org.apache.sshd.scp.client.ScpClient; import org.apache.sshd.scp.client.ScpClientCreator; /** * @author Miracle Luna * @date 2021/7/19 */
public class ScpUtil { // private static String host = "192.168.67.48";
    private static String host = "192.168.67.39"; // private static String host = "192.168.71.29";
    private static String username = "root"; private static String password = "password"; private static Integer port = 22; // private static String local = "F:\\miracle\\*";
    private static String local = "/home/miracle/*"; private static String remote = "/home/luna/"; // private static String remote = "F:\\luna\\";

    public static void scpFile(String local, String remote) throws Exception { long startTime = System.currentTimeMillis(); // 創建 SSH客戶端
        SshClient client = SshClient.setUpDefaultClient(); // 啟動 SSH客戶端
 client.start(); // 通過主機IP、端口和用戶名,連接主機,獲取Session
        ClientSession session = client.connect(username, host, port).verify().getSession(); // 給Session添加密碼
 session.addPasswordIdentity(password); // 校驗用戶名和密碼的有效性
        boolean isSuccess = session.auth().verify().isSuccess(); // 認證成功
        if (isSuccess) { long middleTime = System.currentTimeMillis(); System.out.println("Connect host cost time: " + (middleTime - startTime) / 1000.0 + "s."); ScpClientCreator creator = ScpClientCreator.instance(); // 創建 SCP 客戶端
            ScpClient scpClient = creator.createScpClient(session); System.out.println("Scp beginning."); // ScpClient.Option.Recursive:遞歸copy,可以將子文件夾和子文件遍歷copy
 scpClient.upload(local, remote, ScpClient.Option.Recursive); System.out.println("Scp finished."); // 釋放 SCP客戶端
            if (scpClient != null) { scpClient = null; } // 關閉 Session
            if (session != null && session.isOpen()) { session.close(); } // 關閉 SSH客戶端
            if (client != null && client.isOpen()) { client.stop(); client.close(); } } long endTime = System.currentTimeMillis(); System.out.println("Total Cost time: " + (endTime - startTime) / 1000.0 + "s."); } public static void main(String[] args) throws Exception { scpFile(local, remote); } }

 

2、運行結果

Connect host cost time: 6.519s. Scp beginning. Scp finished. Total Cost time: 9.569s.

 

3、Maven依賴

<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-common -->
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-common</artifactId>
    <version>2.7.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-core -->
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-core</artifactId>
    <version>2.7.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.sshd/sshd-scp -->
<dependency>
    <groupId>org.apache.sshd</groupId>
    <artifactId>sshd-scp</artifactId>
    <version>2.7.0</version>
</dependency>

 

補充說明

該方式適用於Linux到Linux、Linux到Windows、Windows到Linux、Windows到Windows間的文件拷貝。

(和Windows進行文件交互的前提是:Windows安裝了SSH服務端,如OpenSSH,FreeSSHd,Bitvise SSH Server等)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM