Server file upload and download through ssh
Words written in the front
I have previously recorded a method to upload and download server files using the FTP open source component of apache, but later I found that there will be some permission problems when deleting, which will lead to the inability to delete files on the server. Although there is no problem after setting read and write permissions using FileZilla Server on Windows, it is still a bit difficult to use on the server side.
Because I need to implement resource management functions, in addition to the FastDFS storage of single files, some storage of specific resources is still planned to be temporarily stored on the server. The project team colleagues said that they would not open FTP services specifically on the server later, so they changed to SFTP mode to operate.
How to use this thing
First, you need to download the jsch jar package, the address is: http://www.jcraft.com/jsch/. The website also writes very clearly: JSch is a pure Java implementation of SSH2. This is a pure Java implementation of SSH2. Use IP and port, enter the username and password and you can use it normally, which is the same as the usage method of Secure CRT. So how do you use this useful tool?
Actually, it doesn’t matter if you can’t write it. The official also gave an example. The link is: http://www.jcraft.com/jsch/examples/Shell.java. Let’s take a look:
/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- *//** * This program enables you to connect to sshd server and get the shell prompt. * $ CLASSPATH=.:../build javac Shell.java * $ CLASSPATH=.:../build java Shell * You will be asked username, hostname and passwd. * If everything works fine, you will get the shell prompt. Output may * be ugly because of lacks of terminal-emulation, but you can issue commands. * */import com.jcraft.jsch.*;import java.awt.*;import javax.swing.*;public class Shell{ public static void main(String[] arg){ try{ JSch jsch=new JSch(); //jsch.setKnownHosts("/home/foo/.ssh/known_hosts"); String host=null; if(arg.length>0){ host=arg[0]; } else{ host=JOptionPane.showInputDialog("Enter username@hostname", System.getProperty("user.name")+ "@localhost"); } String user=host.substring(0, host.indexOf('@')); host=host.substring(host.indexOf('@')+1); Session session=jsch.getSession(user, host, 22); String passwd = JOptionPane.showInputDialog("Enter password"); session.setPassword(passwd); UserInfo ui = new MyUserInfo(){ public void showMessage(String message){ JOptionPane.showMessageDialog(null, message); } public boolean promptYesNo(String message){ Object[] options={ "yes", "no" }; int foo=JOptionPane.showOptionDialog(null, message, "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); return foo==0; } // If password is not given before the invocation of Session#connect(), // implement also following methods, // * UserInfo#getPassword(), // * UserInfo#promptPassword(String message) and // * UIKeyboardInteractive#promptKeyboardInteractive() }; session.setUserInfo(ui); // It must not be recommended, but if you want to skip host-key check, // invoke following, // session.setConfig("StrictHostKeyChecking", "no"); //session.connect(); session.connect(30000); // making a connection with timeout. Channel channel=session.openChannel("shell"); // Enable agent-forwarding. //((ChannelShell)channel).setAgentForwarding(true); channel.setInputStream(System.in); /* // a hack for MS-DOS prompt on Windows. channel.setInputStream(new FilterInputStream(System.in){ public int read(byte[] b, int off, int len)throws IOException{ return in.read(b, off, (len>1024?1024:len)); } }); */ channel.setOutputStream(System.out); /* // Choose the pty-type "vt102". ((ChannelShell)channel).setPtyType("vt102"); */ /* // Set environment variable "LANG" as "ja_JP.eucJP". ((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP"); */ //channel.connect(); channel.connect(3*1000); } catch(Exception e){ System.out.println(e); } } public static abstract class MyUserInfo implements UserInfo, UIKeyboardInteractive{ public String getPassword(){ return null; } public boolean promptYesNo(String str){ return false; } public String getPassphrase(){ return null; } public boolean promptPassphrase(String message){ return false; } public boolean promptPassword(String message){ return false; } public void showMessage(String message){ } public String[] promptKeyboardInteractive(String destination, String name, String instruction, String[] prompt, boolean[] echo){ return null; } }}In this code, we can basically see what we need. First, we need to create user information. This is mainly used for authentication. Just implement the two interfaces of UserInfo and UIKeyboardInteractive. Then, by creating a session session, set userInfo in, and finally connect.
Encapsulated file upload and download
The above is the basic usage method of Jsch, that is, some basic routines. Let’s encapsulate the functions we want to use, implement a series of operations such as uploading and downloading of files.
First, create a UserInfo:
public class MyUserInfo implements UserInfo, UIKeyboardInteractive{ public String getPassword(){ return null; } public boolean promptYesNo(String str){ return true; } public String getPassphrase(){ return null; } public boolean promptPassphrase(String message){ return true; } public boolean promptPassword(String message){ return true; } public void showMessage(String message){ } @Override public String[] promptKeyboardInteractive(String arg0, String arg1, String arg2, String[] arg3, boolean[] arg4) { return null; }}Here is the implementation class:
package com.tfxiaozi.common.utils;import java.io.InputStream;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Vector;import org.apache.log4j.Logger;import com.jcraft.jsch.Channel;import com.jcraft.jsch.ChannelExec;import com.jcraft.jsch.ChannelSftp;import com.jcraft.jsch.JSch;import com.jcraft.jsch.JSchException;import com.jcraft.jsch.Session;import com.jcraft.jsch.SftpException;import com.jcraft.jsch.SftpProgressMonitor;/** * SSH Utils * @author tfxiaozi * */public class Ssh { Logger logger = Logger.getLogger(this.getClass()); private String host = ""; private String user = ""; private int port = 22; private String password = ""; private static final String PROTOCOL = "sftp"; JSch jsch = new JSch(); private Session session; private Channel channel; private ChannelSftp sftp; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public Ssh() { } public Ssh(String host, int port, String user, String password) { this.host = host; this.user = user; this.password = password; this.port = port; } /** * connect ssh * @throws JSchException */ public void connect() throws JSchException { if (session == null) { session = jsch.getSession(user, host, port); MyUserInfo ui = new MyUserInfo(); session.setUserInfo(ui); session.setPassword(password); session.connect(); channel = session.openChannel(PROTOCOL); channel.connect(); sftp = (ChannelSftp)channel; } } /** * disconnect ssh */ public void disconnect() { if (session != null) { session.disconnect(); session = null; } } /** * upload * @param localFileName * @param remoteFileName * @return */ public boolean upload(String localFileName, String remoteFileName) throws Exception{ boolean bSucc = false; try { SftpProgressMonitor monitor=new MyProgressMonitor(); int mode=ChannelSftp.OVERWRITE; sftp.put(localFileName, remoteFileName, monitor, mode); bSucc = true; } catch(Exception e) { logger.error(e); } finally { if (null != channel) { channel.disconnect(); } } return bSucc; } /** * delete file * @param directory * @param fileName * @return */ public boolean detecteFile(String directory, String fileName) { boolean flag = false; try { sftp.cd(directory); sftp.rm(fileName); flag = true; } catch (SftpException e) { flag = false; logger.error(e); } return flag; } /** * delete directory * @param directory dir to be delete * @param sure be sure to delete * @return */ public String deleteDir(String directory, boolean sure) { String command = "rm -rf " + directory; String result = execCommand(command, true); return result; } /** * compress the files and sub-dir of directory into a zip named compressName * @param directory the content directory to be compress * @param compressName the name in directory after it is compressed * @throws SftpException * @usage ssh.compressDir("/home/tfxiaozi/webapp", "test.zip"); */ public void compressDir(String directory, String compressName) throws SftpException { String command = "cd "+ directory +"/nzip -r " + compressName + " ./" + compressName.substring(0, compressName.lastIndexOf(".")); execCommand(command, true); } /** * download * @param localFileName * @param remoteFileName * @return */ public boolean download(String localFileName, String remoteFileName) { boolean bSucc = false; Channel channel = null; try { SftpProgressMonitor monitor = new MyProgressMonitor(); sftp.get(remoteFileName, localFileName, monitor, ChannelSftp.OVERWRITE); bSucc = true; } catch(Exception e) { logger.error(e); } finally { if (null != channel) { channel.disconnect(); } } return bSucc; } /** * execute command * @param command * @param flag * @return */ public String execCommand(String command, boolean flag) { Channel channel = null; InputStream in = null; StringBuffer sb = new StringBuffer(""); try { channel = session.openChannel("exec"); System.out.println("command:" + command); ((ChannelExec)channel).setCommand("export TERM=ansi && " + command); ((ChannelExec)channel).setErrStream(System.err); in = channel.getInputStream(); channel.connect(); if (flag) { byte[] tmp = new byte[10240]; while (true) { while (in.available()>0) { int i = in.read(tmp, 0, 10240); if(i < 0) { break; } sb.append(new String(tmp, 0, i)); } if (channel.isClosed()){ break; } } } in.close(); } catch(Exception e){ logger.error(e); } finally { if (channel != null) { channel.disconnect(); } } return sb.toString(); } /** * get cpu info * @return */ public String[] getCpuInfo() { Channel channel = null; InputStream in = null; StringBuffer sb = new StringBuffer(""); try { channel = session.openChannel("exec"); ((ChannelExec)channel).setCommand("export TERM=ansi && top -bn 1");//ansi must add in = channel.getInputStream(); ((ChannelExec)channel).setErrStream(System.err); channel.connect(); byte[] tmp = new byte[10240]; while (true) { while (in.available()>0) { int i = in.read(tmp, 0, 10240); if(i < 0) { break; } sb.append(new String(tmp, 0, i)); } if (channel.isClosed()){ break; } } } catch(Exception e){ logger.error(e); } finally { if (channel != null) { channel.disconnect(); } } String buf = sb.toString(); if (buf.indexOf("Swap") != -1) { buf = buf.substring(0, buf.indexOf("Swap")); } if (buf.indexOf("Cpu") != -1) { buf = buf.substring(buf.indexOf("Cpu"), buf.length()); } buf.replaceAll(" ", ""); return buf.split("//n"); } /** * get hard disk info * @return */ public String getHardDiskInfo() throws Exception{ Channel channel = null; InputStream in = null; StringBuffer sb = new StringBuffer(""); try { channel = session.openChannel("exec"); ((ChannelExec)channel).setCommand("df -lh"); in = channel.getInputStream(); ((ChannelExec)channel).setErrStream(System.err); channel.connect(); byte[] tmp = new byte[10240]; while (true) { while (in.available()>0) { int i = in.read(tmp, 0, 10240); if(i < 0) { break; } sb.append(new String(tmp, 0, i)); } if (channel.isClosed()){ break; } } } catch(Exception e){ throw new RuntimeException(e); } finally { if (channel != null) { channel.disconnect(); } } String buf = sb.toString(); String[] info = buf.split("/n"); if(info.length > 2) {//first line: Filesystem Size Used Avail Use% Mounted on String tmp = ""; for(int i=1; i< info.length; i++) { tmp = info[i]; String[] tmpArr = tmp.split("%"); if(tmpArr[1].trim().equals("/")){ boolean flag = true; while(flag) { tmp = tmp.replaceAll(" ", " "); if (tmp.indexOf(" ") == -1){ flag = false; } } String[] result = tmp.split(" "); if(result != null && result.length == 6) { buf = result[1] + " total, " + result[2] + " used, " + result[3] + " free"; break; } else { buf = ""; } } } } else { buf = ""; } return buf; } /** * Return the number of free bytes* @return * @throws Exception */ public double getFreeDisk() throws Exception { String hardDiskInfo = getHardDiskInfo(); if(hardDiskInfo == null || hardDiskInfo.equals("")) { logger.error("get free harddisk space failed......"); return -1; } String[] diskInfo = hardDiskInfo.replace(" ", "").split(","); if(diskInfo == null || diskInfo.length == 0) { logger.error("get free disk info failed......"); return -1; } String free = diskInfo[2]; free = free.substring(0, free.indexOf("free")); //System.out.println("free space:" + free); String unit = free.substring(free.length()-1); //System.out.println("unit:" + unit); String freeSpace = free.substring(0, free.length()-1); double freeSpaceL = Double.parseDouble(freeSpace); //System.out.println("free spaceL:" + freeSpaceL); if(unit.equals("K")) { return freeSpaceL*1024; }else if(unit.equals("M")) { return freeSpaceL*1024*1024; } else if(unit.equals("G")) { return freeSpaceL*1024*1024*1024; } else if(unit.equals("T")) { return freeSpaceL*1024*1024*1024*1024; } else if(unit.equals("P")) { return freeSpaceL*1024*1024*1024*1024; } return 0; } /** * Get all subdirectories and files in the specified directory* @param directory * @return * @throws Exception */ @SuppressWarnings("rawtypes") public List<String> listFiles(String directory) throws Exception { Vector fileList = null; List<String> fileNameList = new ArrayList<String>(); fileList = sftp.ls(directory); Iterator it = fileList.iterator(); while (it.hasNext()) { String fileName = ((ChannelSftp.LsEntry) it.next()).getFilename(); if (fileName.startsWith(".") || fileName.startsWith("..")) { continue; } fileNameList.add(fileName); } return fileNameList; } public boolean mkdir(String path) { boolean flag = false; try { sftp.mkdir(path); flag = true; } catch (SftpException e) { flag = false; } return flag; }}Test it
public static void main(String[] arg) throws Exception{ Ssh ssh = new Ssh("10.10.10.83", 22, "test", "test"); try { ssh.connect(); } catch (JSchException e) { e.printStackTrace(); } /*String remotePath = "/home/tfxiaozi/" + "webapp/"; try { ssh.listFiles(remotePath); } catch (Exception e) { ssh.mkdir(remotePath); }*/ /*boolean b = ssh.upload("d:/test.zip", "webapp/"); System.out.println(b);*/ //String []buf = ssh.getCpuInfo(); //System.out.println("cpu:" + buf[0]); //System.out.println("memo:" + buf[1]); //System.out.println(ssh.getHardDiskInfo().replace("", "")); //System.out.println(ssh.getFreeDisk()); /*List<String> list = ssh.listFiles("webapp/test"); for(String s : list) { System.out.println(s); }*/ /*boolean b = ssh.deteleFile("webapp", "test.zip"); System.out.println(b);*/ /*try { String s = ssh.execCommand("ls -l /home/tfxiaozi/webapp1/test", true); System.out.println(s); } catch (Exception e) { System.out.println(e.getMessage()); }*/ //ssh.sftp.setFilenameEncoding("UTF-8"); /*try { String ss = ssh.execCommand("unzip /home/tfxiaozi/webapp1/test.zip -d /home/tfxiaozi/webapp1/", true); System.out.println(ss); } catch (Exception e) { System.out.println(e.getMessage()); }*/ /*String path = "/home/tfxiaozi/webapp1/test.zip"; try { List<String> list = ssh.listFiles(path); for(String s:list) { System.out.println(s); } System.out.println("ok"); } catch (Exception e) { System.out.println("extract failed...."); }*/ /*String command = "rm -rf /home/tfxiaozi/webapp1/" + "Ink and Wash Chinese Studies"; String sss = ssh.execCommand(command, true); System.out.println(sss);*/ /*String findCommand = "find /home/tfxiaozi/webapp1/Ink and Wash Chinese Studies-name 'index.html'"; String result = ssh.execCommand(findCommand, true); System.out.println(result);*/ /*String path = ""; ssh.listFiles(remotePath);*/ /* ssh.deleteDir("/home/tfxiaozi/webapp1", true); */ //The following will be decompressed to the webapp1 directory, webapp1/test/xxx //ssh.execCommand("unzip /home/tfxiaozi/webapp1/test.zip -d /home/tfxiaozi/webapp1", true); //The following will be decompressed to the /webapp1/test/test/xxx //ssh.execCommand("unzip /home/tfxiaozi/webapp1/test.zip -d /home/tfxiaozi/webapp1", true); //ssh.compressDir("/home/tfxiaozi/webapp1", "test.zip"); //ssh.sftp.cd("/home/tfxiaozi/webapp1"); //ssh.compressDir("/home/tfxiaozi/webapp1", "test.zip"); /*boolean b = ssh.download("d:/temp/test.zip", "webapp/test.zip"); System.out.println(b);*/ //ssh.getHardDiskInfo(); System.out.println(ssh.getFreeDisk()); ssh.disconnect(); } The above is to use Linux to operate directly, but it should be noted that for Chinese files, when decompressing, there may be garbled code when passing in, and parameters need to be added, such as unzip -O cp936 test.zip -d /home/tfxiaozi/test.
The above is all the content of this article. I hope it will be helpful to everyone's learning and I hope everyone will support Wulin.com more.