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

استخدام ssh لتحميل وتنزيل ملفات على الخادم

تحميل وتنزيل ملفات الخادم عبر ssh

كلمات مقدمة

لقد سجلت سابقًا طريقة لتحقيق تحميل وتنزيل ملفات الخادم باستخدام مكون FTP المفتوح المصدر لـ apache، ولكن بعد ذلك وجدت أن هناك مشاكل في الصلاحيات عند الحذف، مما يؤدي إلى عدم القدرة على حذف ملفات الخادم. على الرغم من أن FileZilla Server يعمل بشكل جيد بعد إعداد صلاحيات القراءة والكتابة على Windows، إلا أن استخدامه على الجانب الخادمي ليس جيدًا جدًا.

لأنه يحتاج إلى تنفيذ وظيفة إدارة الموارد، بالإضافة إلى تخزين FastDFS المحدود لملف واحد، فإن تخزين بعض الموارد المحددة سيتم بشكل مؤقت على الخادم، يقول أعضاء الفريق أنهم لن يفتحوا خدمة FTP خاصة على الخادم، لذا تم تغييرها إلى طريقة العمل SFTP.

كيف يمكن استخدام هذا الشئ؟

أولاً، يجب عليك تنزيل مكتبة jsch jar، وهي موجودة في: http://www.jcraft.com/jsch/، ويجب أن يكون هناك وصف واضح على الموقع: JSch هو تنفيذ صافي Java لـ SSH2. هذا هو تنفيذ SSH2 صافي Java. يمكنك استخدام عنوان IP وميناء، وإدخال اسم المستخدم وكلمة المرور للاستخدام الطبيعي، وهو مشابه لـ Secure CRT. إذن كيف يمكن استخدام هذه الأداة المفيدة؟

ليس من الضروري أن تكون مبرمجاً جيداً، حيث قدمت الشركة أمثلة، رابط:http://www.jcraft.com/jsch/examples/Shell.java،لننظر في ذلك:

/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
/**
 * يتيح لك هذا البرنامج الاتصال بخادم sshd للحصول على دعوة الشل.
 * $CLASSPATH=.:../build javac Shell.java 
 * $CLASSPATH=.:../build java Shell
 * سيتم سؤالك عن اسم المستخدم، اسم الخادم وكلمة المرور. 
 * إذا كان كل شيء يعمل بشكل صحيح، ستحصل على دعوة الشل. قد تكون النتائج
 * قد يبدو غير جذاب بسبب نقص دعم محاكاة الطرفية، لكن يمكنك إصدار الأوامر.
 *
 */
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");
  الخادم=null;
  إذا(طولالارتباط>0){
  الخادم=الارتباط[0];
  {}
  else{
  host=JOptionPane.showInputDialog("أدخل اسم المستخدم@اسم الخادم",
           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("أدخل كلمة المرور");
  session.setPassword(passwd);
  UserInfo ui = new MyUserInfo(){
  public void showMessage(String message){
   JOptionPane.showMessageDialog(null, message);
  {}
  public boolean promptYesNo(String message){
   Object[] options={ "نعم", "لا" };
   int foo=JOptionPane.showOptionDialog(null, 
            message,
            "تحذير", 
            JOptionPane.DEFAULT_OPTION, 
            JOptionPane.WARNING_MESSAGE,
            null, options, options[0]);
   return foo==0;
  {}
  // إذا لم يُقدم كلمة المرور قبل دعوة Session#connect()،
  // تنفيذ أيضًا الطرق التالية،
  // * UserInfo#getPassword(),
  // * UserInfo#promptPassword(String message) و
  // * UIKeyboardInteractive#promptKeyboardInteractive()
  };
  session.setUserInfo(ui);
  // لا يجب التوصية بهذا، ولكن إذا كنت ترغب في تجاوز التحقق من مفتاح المضيف،
  // دعوة التالي,
  // session.setConfig("StrictHostKeyChecking", "no");
  //session.connect();
  session.connect(30000); // إجراء اتصال مع وقت انتظار.
  Channel channel=session.openChannel("shell");
  // قم بتمكين التوجيه الأمامي للمندوب.
  //((ChannelShell)channel).setAgentForwarding(true);
  channel.setInputStream(System.in);
  /*
  // تنسيق لحل مشكلة MS-DOS على 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);
  /*
  // اختر نوع pty "vt102".
  ((ChannelShell)channel).setPtyType("vt102");
  */
  /*
  // قم بتعيين متغير بيئي "LANG" كـ "ja_JP.eucJP".
  ((ChannelShell)channel).setEnv("LANG", "ja_JP.eucJP");
  */
  //channel.connect();
  channel.connect(3*1000);
 {}
 catch(Exception e){
  System.out.println(e);
 {}
 {}
 فئة عامة تعريفية تقوم بتوليد MyUserInfo
       يحقق 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;
 {}
 {}
{}

في هذا الكود، يمكننا رؤية الأشياء التي نحتاج إليها، أولاً يجب علينا إنشاء معلومات المستخدم، وهي تستخدم لغرض التحقق من الهوية، فقط يجب علينا تنفيذ هذه الواجهتين UserInfo و UIKeyboardInteractive، ثم يجب إدخال userInfo في session، وأخيرًا إجراء الاتصال.

غلفة تحميل وتنزيل الملفات

ما فوق هو استخدام أساسي لـ 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;
  }
   logger.error(e);
  }
   if (null != channel) {
    channel.disconnect();
   {}
  {}
  return bSucc;
 {}
 /**
  * حذف الملف
  * @param directory
  * @param fileName
  * @return
  */
 public boolean deteleFile(String directory, String fileName) {
  boolean flag = false;
  try {
   sftp.cd(directory);
   sftp.rm(fileName);
   flag = true;
  } تم استثناء Sftp e;
   flag = false;
   logger.error(e);
  {}
  return flag;
 {}
 /**
  * حذف الدليل
  * @param directory الدليل الذي سيتم حذفه
  * @param sure التأكد من الحذف
  * @return
  */
 public String deleteDir(String directory, boolean sure) {
  String command = "rm -rf " + directory;
  String result = execCommand(command, true);
  return result;
 {}
 /**
  * ضغط ملفات وفرع الدليل في ملف zip يُدعى compressName
  * @param directory الدليل المحتوي الذي سيتم ضغطه
  * @param compressName الاسم في الدليل بعد ضغطه
  * @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);
 {}
 /**
  * تنزيل
  * @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;
  }
   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;
  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) {
       else {
      {}
      sb.append(new String(tmp, 0, i));
     {}
     if (channel.isClosed()){
      else {
     {}
    {}
   {}
   in.close();
  } catch(Exception e){
   logger.error(e);
  }
   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) {
      else {
     {}
     sb.append(new String(tmp, 0, i));
    {}
    if (channel.isClosed()){
     else {
    {}
   {}
  } catch(Exception e){
   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;
  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) {
      else {
     {}
     sb.append(new String(tmp, 0, i));
    {}
    if (channel.isClosed()){
     else {
    {}
   {}
  } catch(Exception e){
   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(" ", " ");
      String[] result = tmp.split(" ");
       flag = false;
      {}
     {}
     if(result != null && result.length == 6) {
     buf = result[1] + " total, " + result[2] + " used, " + result[3] + " free";
      break;
      else {
     }
      buf = "";
     {}
    {}
   {}
  }
   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);
  إذا كان unit.equals("K") {
   return freeSpaceL*1024;
  } آخره إذا كان unit.equals("M") {
   return freeSpaceL*1024*1024;
  } آخره إذا كان unit.equals("G") {
   return freeSpaceL*1024*1024*1024;
  } آخره إذا كان unit.equals("T") {
   return freeSpaceL*1024*1024*1024*1024;
  } آخره إذا كان 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();
   إذا كان fileName يبدأ ب (.) أو يبدأ ب (..) {
    continue;
   {}
   fileNameList.add(fileName);
  {}
  return fileNameList;
 {}
 public boolean mkdir(String path) {
  boolean flag = false;
  try {
   sftp.mkdir(path);
   flag = true;
  } تم استثناء Sftp 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("حسنًا");
  } catch (Exception e) {
   System.out.println("فشل الاستخراج....");
  }*/
  /*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.

هذا هو نهاية محتويات هذا المقال، آمل أن يكون هذا المقال مفيدًا جدًا لكم، وأتمنى أن تدعموا وتعطوا دعمكم لتعليمات الصياح.

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية المحتويات تخص صاحب الحقوق، المحتويات تم إدراجها من قبل مستخدمي الإنترنت بتعاونهم وتحميلهم بشكل مستقل، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا رأيت محتويات مشبوهة تتعلق بالحقوق النشرية، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال '#' ب '@') لإبلاغنا، وقدم الدليل على الأدلة، إذا تم التحقق من ذلك، فإن هذا الموقع سيزيل محتويات المشاركة المزعومة فوراً.

أنت قد تحب