ไฟล์เซิร์ฟเวอร์อัปโหลดและดาวน์โหลดผ่าน SSH
คำที่เขียนไว้ด้านหน้า
ก่อนหน้านี้ฉันได้บันทึกวิธีการอัพโหลดและดาวน์โหลดไฟล์เซิร์ฟเวอร์โดยใช้ส่วนประกอบ FTP Open Source ของ Apache แต่หลังจากนั้นฉันพบว่าจะมีปัญหาการอนุญาตบางอย่างเมื่อลบซึ่งจะนำไปสู่การไม่สามารถลบไฟล์บนเซิร์ฟเวอร์ได้ แม้ว่าจะไม่มีปัญหาหลังจากตั้งค่าการอ่านและเขียนโดยใช้ Filezilla Server บน Windows แต่ก็ยังใช้งานได้ยากเล็กน้อยในฝั่งเซิร์ฟเวอร์
เนื่องจากฉันจำเป็นต้องใช้ฟังก์ชั่นการจัดการทรัพยากรนอกเหนือจากที่เก็บข้อมูล FASTDFS ของไฟล์เดียวพื้นที่จัดเก็บข้อมูลเฉพาะบางอย่างยังคงถูกจัดเก็บไว้ชั่วคราวบนเซิร์ฟเวอร์ เพื่อนร่วมงานทีมโครงการกล่าวว่าพวกเขาจะไม่เปิดบริการ FTP โดยเฉพาะบนเซิร์ฟเวอร์ในภายหลังดังนั้นพวกเขาจึงเปลี่ยนเป็นโหมด SFTP เพื่อทำงาน
วิธีใช้สิ่งนี้
ก่อนอื่นคุณต้องดาวน์โหลดแพ็คเกจ JSCH JAR ที่อยู่คือ: http://www.jcraft.com/jsch/ เว็บไซต์ยังเขียนได้อย่างชัดเจน: JSCH เป็นการใช้งาน Java บริสุทธิ์ของ SSH2 นี่คือการใช้ Java บริสุทธิ์ของ SSH2 ใช้ IP และพอร์ตป้อนชื่อผู้ใช้และรหัสผ่านและคุณสามารถใช้งานได้ตามปกติซึ่งเหมือนกับวิธีการใช้งานของ Secure CRT แล้วคุณจะใช้เครื่องมือที่มีประโยชน์นี้ได้อย่างไร?
ที่จริงแล้วมันไม่สำคัญว่าคุณจะไม่สามารถเขียนได้ เจ้าหน้าที่ยังให้ตัวอย่างเช่นกัน ลิงค์คือ: http://www.jcraft.com/jsch/examples/shell.java มาดูกันเถอะ:
/* -* -โหมด: java; C-Basic-Offset: 2; Intent-Tabs-Mode: NIL-*-*// ***โปรแกรมนี้ช่วยให้คุณสามารถเชื่อมต่อกับเซิร์ฟเวอร์ SSHD และรับพรอมต์เชลล์ * $ classpath =.: ../ สร้าง javac shell.java * $ classpath =.: ../ สร้าง Java Shell * คุณจะถูกถามชื่อผู้ใช้ชื่อโฮสต์และ Passwd * หากทุกอย่างทำงานได้ดีคุณจะได้รับพรอมเชลล์ เอาท์พุทอาจ * น่าเกลียดเนื่องจากขาดการปล่อยขั้ว แต่คุณสามารถออกคำสั่งได้ **/นำเข้า com.jcraft.jsch.*; นำเข้า java.awt.*; นำเข้า Javax.swing.*; Shell คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (String [] arg) {ลอง {JSCH JSCH = new JSCH (); //jsch.setNounghosts("/home/foo/.ssh/nown_hosts "); สตริงโฮสต์ = null; if (arg.length> 0) {host = arg [0]; } else {host = joptionpane.showInputDialog ("ป้อนชื่อผู้ใช้@hostname", system.getProperty ("user.name")+ "@localhost"); } string user = host.substring (0, host.indexof ('@')); host = host.substring (host.indexof ('@')+1); เซสชันเซสชัน = jsch.getSession (ผู้ใช้, โฮสต์, 22); String passwd = joptionpane.showInputDialog ("ป้อนรหัสผ่าน"); session.setPassword (passwd); userInfo ui = ใหม่ myuserinfo () {โมฆะสาธารณะ showmessage (ข้อความสตริง) {joptionpane.showMessageDialog (null, ข้อความ); } บูลีนสาธารณะ proftingyesno (ข้อความสตริง) {object [] ตัวเลือก = {"ใช่", "ไม่"}; int foo = joptionpane.ShowoptionDialog (null, ข้อความ, "คำเตือน", joptionpane.default_option, joptionpane.warning_message, null, ตัวเลือก, ตัวเลือก [0]); return foo == 0; } // หากไม่ได้รับรหัสผ่านก่อนการเรียกใช้เซสชัน#connect (), // ใช้วิธีการต่อไปนี้, // * userInfo#getPassword (), // * userInfo#prompterpassword (ข้อความสตริง) และ // * uikeyboardInteractive#prompteyboardinative ()}; session.setUserInfo (UI); // จะต้องไม่แนะนำ แต่ถ้าคุณต้องการข้ามการตรวจสอบ Host-Key, // revoke ต่อไปนี้, // session.setConfig ("StricthostkeyChecking", "No"); //session.connect (); session.connect (30000); // ทำการเชื่อมต่อกับหมดเวลา channel channel = session.openchannel ("shell"); // เปิดใช้งาน Agent-Forwarding //(( ChannelShell) Channel).SetAgentForwarding(True); channel.setInputStream (System.in); /* // แฮ็คสำหรับพรอมต์ MS-DOS บน Windows channel.setInputStream (ใหม่ FilterInputStream (System.in) {public int read (byte [] b, int ปิด, int len) โยน ioexception {return in.read (b, ปิด, (len> 1024? 1024: len));}}); */ channel.setOutputStream (System.out); /* // เลือก pty-type "VT102" ((channelshell) channel) .settytype ("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, uikeyboardInterincative {สตริงสาธารณะ getPassword () {return null; } บูลีนสาธารณะ proftingyesno (string str) {return false; } สตริงสาธารณะ getPassphrase () {return null; } public Boolean PromptEPSPHRATE (ข้อความสตริง) {return false; } บูลีนสาธารณะ proftingPassword (ข้อความสตริง) {return false; } โมฆะสาธารณะ showMessage (ข้อความสตริง) {} สตริงสาธารณะ [] proftressKeyBoardInteractive (ปลายทางสตริง, ชื่อสตริง, คำสั่งสตริง, สตริง [] พรอมต์, บูลีน [] echo) {return null; -ในรหัสนี้เราสามารถเห็นสิ่งที่เราต้องการ ก่อนอื่นเราต้องสร้างข้อมูลผู้ใช้ ส่วนใหญ่ใช้สำหรับการตรวจสอบสิทธิ์ เพียงแค่ใช้อินเทอร์เฟซสองตัวของ UserInfo และ UikeyboardInterincative จากนั้นโดยการสร้างเซสชันเซสชันตั้งค่า userInfo ในและในที่สุดก็เชื่อมต่อ
การอัปโหลดและดาวน์โหลดไฟล์ที่ห่อหุ้ม
ข้างต้นเป็นวิธีการใช้งานพื้นฐานของ JSCH นั่นคือกิจวัตรพื้นฐานบางอย่าง มาสรุปฟังก์ชั่นที่เราต้องการใช้ใช้ชุดการดำเนินงานเช่นการอัปโหลดและดาวน์โหลดไฟล์
ก่อนอื่นสร้าง userInfo:
คลาสสาธารณะ MyUserInfo ใช้ userInfo, uikeyboardInteractive {สตริงสาธารณะ getPassword () {return null; } บูลีนสาธารณะ proftingyesno (string str) {return true; } สตริงสาธารณะ getPassphrase () {return null; } บูลีนสาธารณะ proftingPassphrase (ข้อความสตริง) {return true; } บูลีนสาธารณะ ProftingPassword (ข้อความสตริง) {return true; } โมฆะสาธารณะ showMessage (ข้อความสตริง) {} @Override สตริงสาธารณะ [] proftingKeyBoardInteractive (String arg0, String arg1, String arg2, string [] arg3, boolean [] arg4) {return null; -นี่คือคลาสการใช้งาน:
แพ็คเกจ com.tfxiaozi.common.utils; นำเข้า java.io.inputstream นำเข้า java.util.arraylist; นำเข้า java.util.iterator; นำเข้า java.util.list; นำเข้า java.util.vector com.jcraft.jsch.channelexec; นำเข้า com.jcraft.jsch.channelsftp; นำเข้า com.jcraft.jsch.jsch; นำเข้า com.jcraft.jsch.jschexception; นำเข้า com.jcraft.jsch.session; * @author tfxiaozi * */คลาสสาธารณะ ssh {logger logger = logger.getLogger (this.getClass ()); โฮสต์สตริงส่วนตัว = ""; ผู้ใช้สตริงส่วนตัว = ""; พอร์ต int ส่วนตัว = 22; รหัสผ่านสตริงส่วนตัว = ""; โปรโตคอลสตริงสุดท้ายคงที่ส่วนตัว = "SFTP"; JSCH JSCH = new JSCH (); เซสชั่นส่วนตัว; ช่องช่องส่วนตัว ช่องส่วนตัว SFTP; สตริงสาธารณะ gethost () {return host; } โมฆะสาธารณะ sethost (โฮสต์สตริง) {this.host = โฮสต์; } สตริงสาธารณะ getUser () {return user; } โมฆะสาธารณะ setUser (ผู้ใช้สตริง) {this.user = ผู้ใช้; } สาธารณะ SSH () {} SSH สาธารณะ (สตริงโฮสต์, พอร์ต int, ผู้ใช้สตริง, รหัสผ่านสตริง) {this.host = โฮสต์; this.user = ผู้ใช้; this.password = รหัสผ่าน; this.port = พอร์ต; } / ** * เชื่อมต่อ ssh * @throws jschexception * / โมฆะสาธารณะเชื่อมต่อ () พ่น jschexception {ถ้า (เซสชัน == null) {เซสชัน = jsch.getSession (ผู้ใช้โฮสต์พอร์ต); myuserinfo ui = new myuserinfo (); session.setUserInfo (UI); session.setPassword (รหัสผ่าน); session.connect (); channel = session.openchannel (โปรโตคอล); channel.connect (); ช่อง sftp = (channelsftp); }} / ** * ยกเลิกการเชื่อมต่อ ssh * / โมฆะสาธารณะ disconnect () {ถ้า (เซสชัน! = null) {session.disconnect (); เซสชัน = null; }} / ** * อัปโหลด * @param localFileName * @param remotefileName * @return * / การอัปโหลดบูลีนสาธารณะ (สตริง localfileName, สตริงระยะไกล ลอง {SFTPPROGSMONITOR MONITOR = ใหม่ myProgressMonitor (); โหมด int = channelsftp.overwrite; sftp.put (localfilename, remotefilename, monitor, mode); bsucc = true; } catch (exception e) {logger.error (e); } ในที่สุด {ถ้า (null! = channel) {channel.disconnect (); }} ส่งคืน BSUCC; } / ** * ลบไฟล์ * @param ไดเรกทอรี * @param filename * @return * / public boolean detectefile (ไดเรกทอรีสตริง, ชื่อไฟล์สตริง) {boolean flag = false; ลอง {sftp.cd (ไดเรกทอรี); sftp.rm (ชื่อไฟล์); ธง = จริง; } catch (sftpexception e) {flag = false; logger.error (e); } return flag; } / ** * ลบไดเรกทอรี * @param ไดเรกทอรี dir ที่จะลบ * @param แน่ใจว่าต้องลบ * @return * / สตริงสาธารณะ deletedir (ไดเรกทอรีสตริง, บูลีนแน่ใจ) {สตริงคอมเมนต์ = "rm -rf" + ไดเรกทอรี; String result = execommand (คำสั่ง, true); ผลการกลับมา; }/** * บีบอัดไฟล์และไดเรกทอรีย่อยของไดเรกทอรีลงในซิปชื่อ compressName * @param ไดเรกทอรีไดเรกทอรีเนื้อหาที่จะบีบอัด * @param compressName ชื่อในไดเรกทอรีหลังจากถูกบีบอัด * @throws sftpexception * @usage ssh.compressdir ( */โมฆะสาธารณะ compressDir (ไดเรกทอรีสตริง, สตริง compressName) พ่น sftpexception {string command = "cd" + ไดเรกทอรี + "/nzip -r" + compressName + "./" + compressName.substring (0, compressName.lastindexof (".")); ExecCommand (คำสั่ง, จริง); } / ** * ดาวน์โหลด * @param localfileName * @param remotefilename * @return * / public boolean ดาวน์โหลด (สตริง localfileName, สตริง remotefileName) {boolean bsucc = false; ช่องช่อง = null; ลอง {SFTPPROGSMONITOR MONITOR = ใหม่ myProgressMonitor (); sftp.get (remotefilename, localfilename, monitor, channelsftp.overwrite); bsucc = true; } catch (exception e) {logger.error (e); } ในที่สุด {ถ้า (null! = channel) {channel.disconnect (); }} ส่งคืน BSUCC; } / ** * คำสั่งเรียกใช้งาน * @param คำสั่ง * @param Flag * @return * / public String execommand (คำสั่งสตริง, ธงบูลีน) {channel channel = null; inputStream ใน = null; StringBuffer SB = ใหม่ StringBuffer (""); ลอง {channel = session.openchannel ("exec"); System.out.println ("คำสั่ง:" + คำสั่ง); ((channelexec) channel) .setCommand ("คำสั่งส่งออก = ANSI &&" + คำสั่ง); ((channelexec) ช่อง) .seterstream (System.err); ใน = channel.getInputStream (); channel.connect (); if (flag) {byte [] tmp = byte ใหม่ [10240]; ในขณะที่ (จริง) {ในขณะที่ (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (สตริงใหม่ (tmp, 0, i)); } if (channel.isclosed ()) {break; }}} in.close (); } catch (exception e) {logger.error (e); } ในที่สุด {if (channel! = null) {channel.disconnect (); }} ส่งคืน sb.toString (); } / ** * รับข้อมูล CPU * @return * / String สาธารณะ [] getCpuInfo () {channel channel = null; inputStream ใน = null; StringBuffer SB = ใหม่ StringBuffer (""); ลอง {channel = session.openchannel ("exec"); ((channelexec) channel) .setCommand ("Export Term = Ansi && top -bn 1"); // ansi ต้องเพิ่มใน = channel.getInputStream (); ((channelexec) ช่อง) .seterstream (System.err); channel.connect (); ไบต์ [] tmp = ไบต์ใหม่ [10240]; ในขณะที่ (จริง) {ในขณะที่ (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (สตริงใหม่ (tmp, 0, i)); } if (channel.isclosed ()) {break; }}} catch (exception e) {logger.error (e); } ในที่สุด {if (channel! = null) {channel.disconnect (); }} สตริง 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 ("", ""); ส่งคืน buf.split ("// n"); } / ** * รับข้อมูลฮาร์ดดิสก์ * @return * / สตริงสาธารณะ getharddiskinfo () พ่นข้อยกเว้น {channel channel = null; inputStream ใน = null; StringBuffer SB = ใหม่ StringBuffer (""); ลอง {channel = session.openchannel ("exec"); ((channelexec) channel) .setCommand ("df -lh"); ใน = channel.getInputStream (); ((channelexec) ช่อง) .seterstream (System.err); channel.connect (); ไบต์ [] tmp = ไบต์ใหม่ [10240]; ในขณะที่ (จริง) {ในขณะที่ (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (สตริงใหม่ (tmp, 0, i)); } if (channel.isclosed ()) {break; }}} catch (Exception e) {โยน runtimeException ใหม่ (e); } ในที่สุด {if (channel! = null) {channel.disconnect (); }} สตริง buf = sb.toString (); String [] info = buf.split ("/n"); if (info.length> 2) {// บรรทัดแรก: ขนาดระบบไฟล์ใช้ประโยชน์ใช้ประโยชน์ใช้% ที่ติดตั้งบนสตริง tmp = ""; สำหรับ (int i = 1; i <info.length; i ++) {tmp = ข้อมูล [i]; String [] tmparr = tmp.split ("%"); if (tmparr [1] .trim (). เท่ากับ ("/")) {ธงบูลีน = true; ในขณะที่ (ธง) {tmp = tmp.replaceall ("", ""); if (tmp.indexof ("") == -1) {flag = false; }} string [] result = tmp.split (""); if (result! = null && result.length == 6) {buf = ผลลัพธ์ [1] + "รวม" + ผลลัพธ์ [2] + "ใช้" + ผลลัพธ์ [3] + "ฟรี"; หยุดพัก; } else {buf = ""; }}}} else {buf = ""; } return buf; } / ** * ส่งคืนจำนวนไบต์ฟรี * @return * @throws ยกเว้น * / สาธารณะ double getFreedisk () พ่นข้อยกเว้น {String harddiskinfo = getharddiskinfo (); if (harddiskinfo == null || harddiskinfo.equals ("")) {logger.error ("รับพื้นที่ harddisk ฟรีล้มเหลว ...... "); กลับ -1; } string [] diskinfo = harddiskinfo.replace ("", "") .split (","); if (diskinfo == null || diskinfo.length == 0) {logger.error ("รับข้อมูลดิสก์ฟรีล้มเหลว ...... "); กลับ -1; } สตริงฟรี = diskinfo [2]; ฟรี = ฟรี. substring (0, free.indexof ("ฟรี")); //system.out.println("free Space: " + ฟรี); string unit = free.substring (free.length ()-1); //system.out.println("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; } อื่นถ้า (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; } return 0; } / ** * รับไดเรกทอรีย่อยและไฟล์ทั้งหมดในไดเรกทอรีที่ระบุ * @param Directory * @return * @throws Exception * / @suppresswarnings ("Rawtypes") รายการสาธารณะ <String> ListFiles (String Directory) รายการ <String> filenamelist = new ArrayList <String> (); fileList = sftp.ls (ไดเรกทอรี); iterator it = filelist.iterator (); ในขณะที่ (it.hasnext ()) {สตริง filename = ((channelsftp.lsentry) it.next ()). getFileName (); if (filename.startswith (".") || filename.startswith (".. ")) {ดำเนินการต่อ; } filenamelist.add (ชื่อไฟล์); } return filenamelist; } บูลีนสาธารณะ mkdir (เส้นทางสตริง) {boolean flag = false; ลอง {sftp.mkdir (เส้นทาง); ธง = จริง; } catch (sftpexception e) {flag = false; } return flag; -ทดสอบ
โมฆะคงที่สาธารณะหลัก (สตริง [] arg) โยนข้อยกเว้น {ssh ssh = ใหม่ ssh ("10.10.10.83", 22, "ทดสอบ", "ทดสอบ"); ลอง {ssh.connect (); } catch (jschexception e) {e.printstacktrace (); }/*สตริง remotePath = "/home/tfxiaozi/" + "webapp/"; ลอง {ssh.listfiles (remotepath); } catch (exception e) {ssh.mkdir (remotepath); }*//*บูลีน 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 (). แทนที่ ("", "")); //system.out.println (ssh.getfreedisk ()); /*รายการ <string> list = ssh.listfiles ("WebApp/Test"); สำหรับ (String s: list) {system.out.println (s); }* / /*บูลีน b = ssh.detelefile ("webapp", "test.zip"); System.out.println (b);*//*ลอง {String s = ssh.execcommand ("ls -l/home/tfxiaozi/webapp1/test", จริง); System.out.println (s); } catch (exception e) {system.out.println (e.getMessage ()); }*///ssh.sftp.setfilenameencoding("utf-8 "); /*ลอง {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 ()); }*//*path String = "/home/tfxiaozi/webapp1/test.zip"; ลอง {list <string> list = ssh.listfiles (พา ธ ); สำหรับ (String s: list) {system.out.println (s); } system.out.println ("ตกลง"); } catch (exception e) {system.out.println ("สารสกัดล้มเหลว .... "); }*//*command string = "rm -rf/home/tfxiaozi/webapp1/" + "หมึกและล้างการศึกษาภาษาจีน"; String sss = ssh.execcommand (คำสั่ง, จริง); System.out.println (SSS);*//*สตริง findCommand = "ค้นหา/home/tfxiaozi/webapp1/หมึกและล้าง index-name index.html '"; สตริงผลลัพธ์ = ssh.execcommand (findCommand, จริง); System.out.println (ผลลัพธ์);* / /*path String = ""; ssh.listfiles (remotepath);*//* ssh.deletedir ("/home/tfxiaozi/webapp1", จริง); */// ต่อไปนี้จะถูกบีบอัดไปยังไดเรกทอรี webapp1, webapp1/test/xxx //ssh.execommand("Unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1 "จริง); // ต่อไปนี้จะถูกบีบอัดไปยัง/webapp1/test/test/xxx //ssh.execommand("Unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1 ", จริง); //ssh.compressdir("/home/tfxiaozi/webapp1 "," test.zip "); //ssh.sftp.cd("/home/tfxiaozi/webapp1 "); //ssh.compressdir("/home/tfxiaozi/webapp1 "," test.zip "); /*บูลีน 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
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น