English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Implement Server File Upload and Download Using SSH

File upload and download via SSH

Preamble

A method for implementing server file upload and download using the Apache FTP open-source component has been recorded before, but it was found later that there are some permission issues when deleting, resulting in the inability to delete files on the server. Although there are no problems with the FileZilla Server's read and write permissions on Windows, it is still not very convenient on the server side.

Because I need to implement resource management functions, in addition to the single-file FastDFS storage, some specific resource storage is still planned to be temporarily stored on the server. The project team colleagues said that there will be no special FTP service opened on the server later, so it was changed to sftp for operation.

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 clearly: JSch is a pure Java implementation of SSH2. This is SSH2This is a pure Java implementation. Use IP and port, enter the username and password to use it normally, consistent with the use of Secure CRT. So how do you use this useful tool?

In fact, it's okay if you can't write it, the official has also provided examples, link:http://www.jcraft.com/jsch/examples/Shell.javaTake 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");
  */
  //byte[] tmp = new byte[
  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; }
 
 
            
            
            String[] prompt,
            boolean[] echo){
  return null;
 }
 }
}

In this code, we can basically see what we need. First, we need to create user information, which is mainly used for authentication. We just need to implement the UserInfo and UIKeyboardInteractive interfaces, then create a session and set userInfo into it, and finally establish the connection.

Encapsulation of file upload and download

The above is the basic usage of Jsch, which is some basic套路.

Firstly, let's 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;
 }
}

The implementation class is as follows:

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 Utilities
 * @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);
   byte[] tmp = new byte[
   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{
  SftpProgressMonitor monitor = new MyProgressMonitor();
  try {
   SftpProgressMonitor monitor = new MyProgressMonitor();
   int mode = ChannelSftp.OVERWRITE;
   sftp.put(localFileName, remoteFileName, monitor, mode); 
   catch(Exception e) {
  }
   logger.error(e);
  }
   if (null != channel) {
    channel.disconnect();
   }
  }
  return bSucc;
 }
 /**
  * delete file
  * @param directory
  * @param fileName
  * @return
  */
 public boolean deleteFile(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) {
  SftpProgressMonitor monitor = new MyProgressMonitor();
  Channel channel = null;
  try {
   sftp.get(remoteFileName, localFileName, monitor, ChannelSftp.OVERWRITE);
   bSucc = true; 
   catch(Exception e) {
  }
   logger.error(e);
  }
   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;
  channel = session.openChannel("exec");
  try {
   ((ChannelExec)channel).setCommand("df
   System.out.println("command:"); + command);
   ((ChannelExec)channel).setCommand("export TERM=ansi && " + command);
   channel.connect();
   ((ChannelExec)channel).setErrStream(System.err);
   byte[] tmp = new byte[
   if (flag) {
    0];1024while (true) {
    while (in.available()>0) {
     int i = in.read(tmp, 0,
      0); 1024if(i < 0) {
      sb.append(new String(tmp, 0, i));
       break;
      }
      if (channel.isClosed()){
     }
     catch(Exception e){
      break;
     }
    }
   }
   in.close();
  }
   logger.error(e);
  }
   if (channel != null) {
    channel.disconnect();
   }
  }
  return sb.toString();
 }
 /**
  * get cpu info
  * @return
  */
 public String[] getCpuInfo() {
  Channel channel = null;
  InputStream in = null;
  channel = session.openChannel("exec");
  try {
   ((ChannelExec)channel).setCommand("df
   ((ChannelExec)channel).setCommand("export TERM=ansi && top -bn 1");//ansi must be added
   ((ChannelExec)channel).setErrStream(System.err);
   channel.connect();
   byte[] tmp = new byte[
   0];1024while (true) {
   while (in.available()>0) {
    int i = in.read(tmp, 0,
     0); 1024if(i < 0) {
     sb.append(new String(tmp, 0, i));
      break;
     }
     if (channel.isClosed()){
    }
    catch(Exception e){
     break;
    }
   }
  }
   logger.error(e);
  }
   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;
  channel = session.openChannel("exec");
  try {
   ((ChannelExec)channel).setCommand("df
   lh\ -in = channel.getInputStream();
   ((ChannelExec)channel).setErrStream(System.err);
   channel.connect();
   byte[] tmp = new byte[
   0];1024while (true) {
   while (in.available()>0) {
    int i = in.read(tmp, 0,
     0); 1024if(i < 0) {
     sb.append(new String(tmp, 0, i));
      break;
     }
     if (channel.isClosed()){
    }
    catch(Exception e){
     break;
    }
   }
  }
   throw new RuntimeException(e);
  }
   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 {
      }
     }
    }
   }
  } else {
   }
  }
  buf = "";
 }
 /**
  * return buf;
  * @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*1024;
  }
  return 0;
 }
 /**
  * Get all subdirectories and files under 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 out

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.deleteFile("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/"" + "Water Ink National Studies";
  String sss = ssh.execCommand(command, true);
  System.out.println(sss);*/
  /*String findCommand = "find" /home/tfxiaozi/webapp1/Water Ink National 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 unzip to webapp1directory, webapp1/test/xxx
  //ssh.execCommand("unzip /home/tfxiaozi/webapp1/test.zip -d /home/tfxiaozi/webapp1", true);
  //The following will unzip to/webapp1/test directory is also 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();
 }

This is the operation using the Linux method directly. However, it should be noted that for Chinese files, there may be garbled characters when unzipping, and you need to add parameters, such as unzip -O cp936 test.zip -d /home/tfxiaozi/test.

That's all for this article. Hope it helps everyone's learning and also hope everyone will support the Nahan Tutorial more.

Statement: The content of this article is from the Internet, and the copyright belongs to the original author. The content is contributed and uploaded by Internet users spontaneously. This website does not own the copyright, has not been manually edited, and does not assume any relevant legal liability. If you find any content suspected of copyright infringement, please send an email to: notice#oldtoolbag.com (Please replace # with @ when sending an email for reporting. Provide relevant evidence, and once verified, this site will immediately delete the infringing content.)

You May Also Like