ssh를 이용하여 서버 파일 업로드 다운로드 실현

ssh를 통해 서버 파일 업로드 다운로드
앞에 쓰시면
이전에apache의 FTP 소스 구성 요소를 사용하여 서버 파일을 업로드하고 다운로드하는 방법을 기록한 적이 있지만, 삭제할 때 권한 문제가 있어 서버의 파일을 삭제할 수 없습니다.Windows에서 FileZilla Server를 사용하여 읽기와 쓰기 권한을 설정하면 문제가 없지만 서버에서는 사용하기 어렵습니다.
자원 관리 기능을 실현해야 하기 때문에 단일 파일의 FastDFS 저장소를 제외하고 일부 특정 자원의 저장소는 서버에 잠시 저장하려고 합니다. 프로젝트 팀 동료가 서버에서 FTP 서비스를 전문적으로 열지 않는다고 해서 sftp 방식으로 조작했습니다.
이 물건은 어떻게 써야 합니까
우선 jschjar 패키지를 다운로드해야 합니다. 주소는 다음과 같습니다.http://www.jcraft.com/jsch/.사이트에도 잘 쓰여 있습니다: JSch is a pure Java implementation of SSH2.이것은 SSH2의 순수한 Java 구현입니다.IP와 포트를 사용하면 사용자 이름 비밀번호를 입력하면 정상적으로 사용할 수 있으며 Secure CRT 사용 방식과 일치합니다.그러면 어떻게 이 유용한 도구를 사용합니까?
사실 쓸 줄 몰라도 괜찮아요. 정부에서도 예시를 제시했어요. 링크:http://www.jcraft.com/jsch/examples/Shell.java 한 번 봅시다.

/* -*-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;
 }
 }
}

이 코드에서 우리는 기본적으로 필요한 것을 볼 수 있다. 우선 사용자 정보를 만들어야 한다. 이것은 주로 인증을 할 때 사용하는 것이다. User Info, UIKeyboard Interactive 두 인터페이스를 실현하면 된다. 그리고 세션 세션을 만들어서 user Info를 설정하고 마지막으로 연결하면 된다.
봉인 파일 업로드 다운로드
위쪽은 Jsch의 기본적인 사용 방법, 즉 기본적인 방법입니다.다음은 우리가 사용하고자 하는 기능을 봉인하여 파일의 업로드와 다운로드 등 일련의 조작을 실현하는 것이다.
먼저 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;
 }
}

다음은 구현 클래스입니다.

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 deteleFile(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 +"
zip -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 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(" ", "&nbsp;"); return buf.split("\
"); } /** * 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("
"); 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 * @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; } /** * * @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; } }
테스트 해봐.

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/" + " ";
  String sss = ssh.execCommand(command, true);
  System.out.println(sss);*/

  /*String findCommand = "find /home/tfxiaozi/webapp1/  -name 'index.html'";
  String result = ssh.execCommand(findCommand, true);
  System.out.println(result);*/

  /*String path = "";
  ssh.listFiles(remotePath);*/

  /*
  ssh.deleteDir("/home/tfxiaozi/webapp1", true);
   */

  // webapp1 ,webapp1/test/xxx
  //ssh.execCommand("unzip /home/tfxiaozi/webapp1/test.zip -d /home/tfxiaozi/webapp1", true);
  // /webapp1/test , 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();
 }

이상은 바로 linux 방식을 사용하여 조작하는 것입니다. 그러나 주의해야 할 것은 중국어 파일에 대해 압축을 풀 때 전송할 때 코드가 엉망이 될 수 있습니다. 예를 들어 unzip-O cp936 test와 같은 매개 변수를 추가해야 합니다.zip -d/home/tfxiaozi/test.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기