Java 執行linux scp 遠端獲取檔案和上傳
需要的jar包:ganymed-ssh2-build210.jar
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.SCPClient; public class Scpclient { // public Scpclient(){} static private Scpclient instance; static synchronized public Scpclient getInstance(String IP, int port, String username, String passward) { if (instance == null) { instance = new Scpclient(IP, port, username, passward); } return instance; } public Scpclient(String IP, int port, String username, String passward) { this.ip = IP; this.port = port; this.username = username; this.password = passward; } public void getFile(String remoteFile, String localTargetDirectory) { Connection conn = new Connection(ip,port); try { conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (isAuthenticated == false) { System.err.println("authentication failed"); } SCPClient client = new SCPClient(conn); client.get(remoteFile, localTargetDirectory); conn.close(); } catch (IOException ex) { Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex); } } public void putFile(String localFile, String remoteTargetDirectory) { Connection conn = new Connection(ip,port); try { conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (isAuthenticated == false) { System.err.println("authentication failed"); } SCPClient client = new SCPClient(conn); client.put(localFile, remoteTargetDirectory); conn.close(); } catch (IOException ex) { Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex); } } public void putFile(String localFile, String remoteFileName,String remoteTargetDirectory,String mode) { Connection conn = new Connection(ip,port); try { conn.connect(); boolean isAuthenticated = conn.authenticateWithPassword(username, password); if (isAuthenticated == false) { System.err.println("authentication failed"); } SCPClient client = new SCPClient(conn); if((mode == null) || (mode.length() == 0)){ mode = "0600"; } client.put(localFile, remoteFileName, remoteTargetDirectory, mode); //重新命名 ch.ethz.ssh2.Session sess = conn.openSession(); String tmpPathName = remoteTargetDirectory +File.separator+ remoteFileName; String newPathName = tmpPathName.substring(0, tmpPathName.lastIndexOf(".")); sess.execCommand("mv " + remoteFileName + " " + newPathName);//重新命名回來 conn.close(); } catch (IOException ex) { Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex); } } // public void putFile(String localFile, String remoteFileName,String remoteTargetDirectory) { // Connection conn = new Connection(ip,port); // try { // conn.connect(); // boolean isAuthenticated = conn.authenticateWithPassword(username, // password); // if (isAuthenticated == false) { // System.err.println("authentication failed"); // } // SCPClient client = new SCPClient(conn); // client.put(getBytes(localFile), remoteFileName, remoteTargetDirectory); // conn.close(); // } catch (IOException ex) { // Logger.getLogger(SCPClient.class.getName()).log(Level.SEVERE, null,ex); // } // } public static byte[] getBytes(String filePath) { byte[] buffer = null; try { File file = new File(filePath); FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(1024*1024); byte[] b = new byte[1024*1024]; int i; while ((i = fis.read(b)) != -1) { byteArray.write(b, 0, i); } fis.close(); byteArray.close(); buffer = byteArray.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer; } private String ip; private int port; private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } } 呼叫方法: Scpclient scp = Scpclient.getInstance(ip, port,uname,pwd); scp.putFile("本地檔案路徑", fileFeed.getName()+".tmp", "推送檔案,到伺服器的目錄路徑", null); scp.getFile(remoteFile, localTargetDirectory);