Unggah file server dan unduh melalui ssh
Kata -kata yang ditulis di depan
Saya sebelumnya telah merekam metode untuk mengunggah dan mengunduh file server menggunakan komponen sumber terbuka FTP dari Apache, tetapi kemudian saya menemukan bahwa akan ada beberapa masalah izin saat menghapus, yang akan menyebabkan ketidakmampuan untuk menghapus file di server. Meskipun tidak ada masalah setelah mengatur izin baca dan tulis menggunakan server FileZilla di Windows, masih agak sulit digunakan di sisi server.
Karena saya perlu menerapkan fungsi manajemen sumber daya, selain penyimpanan FASTDFS dari file tunggal, beberapa penyimpanan sumber daya tertentu masih direncanakan untuk sementara waktu disimpan di server. Rekan -rekan tim proyek mengatakan bahwa mereka tidak akan membuka layanan FTP secara khusus di server nanti, sehingga mereka berubah ke mode SFTP untuk beroperasi.
Bagaimana menggunakan benda ini
Pertama, Anda perlu mengunduh paket JSCH JAR, alamatnya adalah: http://www.jcraft.com/jsch/. Situs web ini juga menulis dengan sangat jelas: JSCH adalah implementasi Java murni dari SSH2. Ini adalah implementasi Java murni SSH2. Gunakan IP dan port, masukkan nama pengguna dan kata sandi dan Anda dapat menggunakannya secara normal, yang sama dengan metode penggunaan CRT yang aman. Jadi bagaimana Anda menggunakan alat yang berguna ini?
Sebenarnya, tidak masalah jika Anda tidak bisa menulisnya. Pejabat itu juga memberi contoh. Tautannya adalah: http://www.jcraft.com/jsch/examples/shell.java. Mari kita lihat:
/* -* -mode: java; c-basic-offset: 2; Indent-Tabs-mode: nil-*-*// ***Program ini memungkinkan Anda untuk terhubung ke server SSHD dan mendapatkan prompt shell. * $ Classpath = .: ../ Bangun javac shell.java * $ classpath = .: ../ Bangun java shell * Anda akan diminta nama pengguna, hostname, dan passwd. * Jika semuanya berfungsi dengan baik, Anda akan mendapatkan prompt shell. Output mungkin * jelek karena kurangnya emulasi terminal, tetapi Anda dapat mengeluarkan perintah. **/impor com.jcraft.jsch.*; import java.awt.*; import javax.swing.*; kelas publik shell {public static void main (string [] arg) {coba {jsch jsch = new jsch (); //jsch.setnomnenthosts("/home/foo/.ssh/nown_hosts "); Host string = 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); Sesi sesi = jsch.getSession (pengguna, host, 22); String passwd = jOptionPane.showInputDialog ("masukkan kata sandi"); session.setpassword (passwd); UserInfo ui = myUserInfo baru () {public void showMessage (pesan string) {jOptionPane.showmessageDialog (null, pesan); } public boolean promptyesno (pesan string) {objek [] option = {"yes", "no"}; int foo = joptionpane.showoptiondialog (null, pesan, "peringatan", joptionpane.default_option, joptionpane.warning_message, null, opsi, opsi [0]); return foo == 0; } // Jika kata sandi tidak diberikan sebelum doa sesi#connect (), // mengimplementasikan juga metode berikut, // * userInfo#getPassword (), // * userInfo#promptPassword (pesan string) dan // * uikeyboardinteractive#prompteyboardInteractive ()}; session.setUserInfo (UI); // Itu tidak boleh direkomendasikan, tetapi jika Anda ingin melewatkan pemeriksaan host-key, // menggunakan berikut, // session.setConfig ("stricthostKeyChecking", "no"); //session.connect (); session.connect (30000); // membuat koneksi dengan batas waktu. Saluran saluran = session.openchannel ("shell"); // Aktifkan agen-maju. //((Channelshell)Channel).setAgentForwarding(true); channel.setInputStream (System.in); /* // Peretasan untuk prompt MS-DOS di Windows. channel.setInputStream (filterInputStream baru (System.in) {public int read (byte [] b, int off, int len) melempar ioException {return in.read (b, off, (len> 1024? 1024: len));}}); */ channel.setoutputStream (System.out); /* // Pilih tipe PTY "VT102". (ChannelShell) channel) .setPtyType ("VT102"); * / /* // Tetapkan variabel lingkungan "lang" sebagai "ja_jp.eucjp". ((Channelshell) channel) .setenv ("lang", "ja_jp.eucjp"); *///channel.connect (); channel.connect (3*1000); } catch (Exception e) {System.out.println (e); }} kelas abstrak statis public myuserInfo mengimplementasikan userInfo, uikeyboardinteractive {public string getPassword () {return null; } public boolean promptyesno (string str) {return false; } public string getPassphrase () {return null; } public boolean promptpassphrase (pesan string) {return false; } public boolean promptpassword (pesan string) {return false; } public void showMessage (string message) {} public string [] promptKeyBoardInctive (tujuan string, nama string, instruksi string, string [] prompt, boolean [] echo) {return null; }}}Dalam kode ini, kita pada dasarnya dapat melihat apa yang kita butuhkan. Pertama, kita perlu membuat informasi pengguna. Ini terutama digunakan untuk otentikasi. Cukup terapkan dua antarmuka UserInfo dan UikeyboardInteractive. Kemudian, dengan membuat sesi sesi, atur UserInfo, dan akhirnya terhubung.
Unggah dan unduh file yang dienkapsulasi
Di atas adalah metode penggunaan dasar JSCH, yaitu beberapa rutinitas dasar. Mari kita merangkum fungsi yang ingin kami gunakan, mengimplementasikan serangkaian operasi seperti mengunggah dan mengunduh file.
Pertama, buat userInfo:
kelas publik myuserInfo mengimplementasikan userInfo, uikeyboardinteractive {public string getPassword () {return null; } public boolean promptyesno (string str) {return true; } public string getPassphrase () {return null; } public boolean promptpassphrase (pesan string) {return true; } public boolean promptpassword (pesan string) {return true; } public void showMessage (string message) {} @Override public string [] promptKeyboardInteractive (string arg0, string arg1, string arg2, string [] arg3, boolean [] arg4) {return null; }}Inilah kelas implementasinya:
Paket com.tfxiaozi.common.utils; impor java.io.inputstream; impor java.util.arraylist; impor java.util.iterator; impor impor; impor; impor; Impornelsch.apache.log4j.logger; impor; com.jcraft.jsch.channelexec; import com.jcraft.jsch.channelsftp; impor com.jcraft.jsch.jsch; impor com.jcraft.jsch.jschexception; impor com.jcraft.jsch.session; impor com.jcraft.jsch.sftpException; comrcricscspion; comrogron; Utils * @author tfxiaozi * */kelas publik ssh {logger logger = logger.getLogger (this.getClass ()); Private String Host = ""; private string user = ""; Private int port = 22; Private String Password = ""; Protokol String Terakhir Statis Pribadi = "SFTP"; Jsch jsch = jsch baru (); sesi sesi pribadi; saluran saluran pribadi; saluran pribadiftp 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 (host string, port int, pengguna string, kata sandi string) {this.host = host; this.user = pengguna; this.password = kata sandi; this.port = port; } / ** * Connect ssh * @throws jschexception * / public void connect () melempar JSChException {if (session == null) {session = jsch.getSession (user, host, port); Myuserinfo ui = myuserinfo baru (); session.setUserInfo (UI); session.setPassword (kata sandi); session.connect (); channel = session.openchannel (protokol); channel.connect (); saluran sftp = (channelsftp); }} / ** * Putuskan ssh * / public void disconnect () {if (session! = null) {session.disconnect (); sesi = null; }} / ** * Unggah * @param localfileName * @param remoteFileName * @return * / unggahan boolean publik (string localfileName, string remoteFileName) melempar pengecualian {boolean bsicc = false; coba {sftpprogressMonitor monitor = myProgressMonitor baru (); int mode = channelsftp.overwrite; sftp.put (localfilename, remoteFileName, monitor, mode); BSUCC = true; } catch (Exception e) {logger.error (e); } akhirnya {if (null! = channel) {channel.disconnect (); }} return bsucc; } / ** * Hapus file * @param direktori * @param fileName * @return * / detectefile boolean publik (direktori string, string fileName) {boolean flag = false; coba {sftp.cd (direktori); sftp.rm (nama file); bendera = true; } catch (sftpexception e) {flag = false; Logger.Error (e); } mengembalikan bendera; } / ** * Hapus direktori * @param direktori dir akan dihapus * @param pastikan untuk menghapus * @return * / public string deletedir (direktori string, boolean tentu saja) {command string = "rm -rf" + direktori; String result = exectCommand (perintah, true); hasil pengembalian; } /** * 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 (Direktori String, String CompressName) Melempar SftpException {Command String = "CD" + Direktori + "/NZIP -R" + CompressName + "./" + CompressName.SubString (0, CompressName.LastIndexof (".")); ExecCommand (Command, True); } / ** * Unduh * @param localfileName * @param remotefileName * @return * / download public boolean (string localfileName, string remoteFileName) {boolean bsucc = false; Saluran saluran = null; coba {sftpprogressMonitor monitor = myProgressMonitor baru (); sftp.get (remotefileName, localfileName, monitor, channelsftp.overwrite); BSUCC = true; } catch (Exception e) {logger.error (e); } akhirnya {if (null! = channel) {channel.disconnect (); }} return bsucc; } / ** * Jalankan perintah * @param perintah * @param flag * @return * / public string execCommand (perintah string, bendera boolean) {channel channel = null; Inputstream in = null; StringBuffer SB = New StringBuffer (""); coba {channel = session.openchannel ("exec"); System.out.println ("Perintah:" + Command); ((Channelexec) saluran) .setCommand ("istilah ekspor = ansi &&" + perintah); ((Channelexec) saluran) .seterRstream (System.err); di = channel.getInputStream (); channel.connect (); if (flag) {byte [] tmp = byte baru [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (string baru (tmp, 0, i)); } if (channel.isclosed ()) {break; }}} in.close (); } catch (Exception e) {logger.error (e); } akhirnya {if (channel! = null) {channel.disconnect (); }} return sb.toString (); } / ** * Dapatkan info CPU * @return * / public string [] getCpuInfo () {channel channel = null; Inputstream in = null; StringBuffer SB = New StringBuffer (""); coba {channel = session.openchannel ("exec"); ((Channelexec) channel) .setCommand ("istilah ekspor = ansi && top -bn 1"); // ansi harus menambahkan in = channel.getInputStream (); ((Channelexec) saluran) .seterRstream (System.err); channel.connect (); byte [] tmp = byte baru [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (string baru (tmp, 0, i)); } if (channel.isclosed ()) {break; }}} catch (Exception e) {logger.error (e); } akhirnya {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"); } / ** * Dapatkan info hard disk * @return * / string publik getharddiskInfo () melempar pengecualian {saluran saluran = null; Inputstream in = null; StringBuffer SB = New StringBuffer (""); coba {channel = session.openchannel ("exec"); ((Channelexec) saluran) .setCommand ("df -lh"); di = channel.getInputStream (); ((Channelexec) saluran) .seterRstream (System.err); channel.connect (); byte [] tmp = byte baru [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (string baru (tmp, 0, i)); } if (channel.isclosed ()) {break; }}} catch (Exception e) {lempar runtimeException baru (e); } akhirnya {if (channel! = null) {channel.disconnect (); }} String buf = sb.toString (); String [] info = buf.split ("/n"); if (info.length> 2) {// baris pertama: ukuran sistem file digunakan tersedia digunakan% dipasang pada string tmp = ""; untuk (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 [] hasil = tmp.split (""); if (hasil! = null && result.length == 6) {buf = hasil [1] + "total," + hasil [2] + "digunakan," + hasil [3] + "gratis"; merusak; } else {buf = ""; }}}} else {buf = ""; } return buf; } / ** * Mengembalikan jumlah byte gratis * @return * @throws Exception * / public getfreedisk () melempar pengecualian {string harddiskinfo = getHardDiskInfo (); if (harddiskInfo == null || harddiskinfo.equals ("")) {logger.error ("Dapatkan ruang harddisk gratis gagal ......"); kembali -1; } String [] diskinfo = harddiskinfo.replace ("", "") .split (","); if (diskinfo == null || diskinfo.length == 0) {logger.error ("Dapatkan info disk gratis gagal ......"); kembali -1; } String free = diskinfo [2]; gratis = gratis. //System.out.println("free space: " + gratis); Unit string = free.substring (free.length ()-1); //System.out.println("unit: " + unit); String freespace = free.substring (0, free.length ()-1); freespacel ganda = double.parsedouble (freespace); //System.out.println(" Spacel Free: " + 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; } / ** * Dapatkan semua subdirektori dan file dalam direktori yang ditentukan * Direktori @param * @return * @throws Exception * / @suppressWarnings ("RawTypes") Daftar Publik <String> ListFiles (String Directory) melempar pengecualian {vector fileList = null; Daftar <String> filenameList = ArrayList baru <string> (); FileList = sftp.ls (direktori); Iterator it = filelist.iterator (); while (it.hasnext ()) {string filename = ((channelsftp.lsentry) it.next ()). getFileName (); if (filename.startswith (".") || filename.startswith ("..")) {lanjutan; } filenamelist.add (nama file); } return filenamelist; } public boolean mkdir (string path) {boolean flag = false; coba {sftp.mkdir (path); bendera = true; } catch (sftpexception e) {flag = false; } mengembalikan bendera; }}UJI
public static void main (string [] arg) melempar Exception {ssh ssh = new ssh ("10.10.10.83", 22, "test", "test"); coba {ssh.connect (); } catch (JSChException e) {E.PrintStackTrace (); }/*String remotePath = "/home/tfxiaozi/" + "webapp/"; coba {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 (). Ganti ("", "")); //System.out.println (ssh.getFreedisk ()); /*Daftar <String> list = ssh.listFiles ("Webapp/test"); untuk (string s: list) {System.out.println (s); }* / /*boolean b = ssh.detelefile ("webapp", "test.zip"); System.out.println (b);*///*coba {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 "); /*coba {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"; coba {list <string> list = ssh.listFiles (path); untuk (string s: list) {System.out.println (s); } System.out.println ("OK"); } catch (Exception e) {System.out.println ("Ekstrak Gagal ...."); }*//*Perintah string = "rm -rf/home/tfxiaozi/webapp1/" + "tinta dan cuci studi Cina"; String sss = ssh.execCommand (perintah, true); System.out.println (sss);*//*string findCommand = "find/home/tfxiaozi/webapp1/tinta dan cuci-nama studi Cina 'index.html'"; String result = ssh.execCommand (findCommand, true); System.out.println (hasil);* / /*string path = ""; ssh.listfiles (remotePath);*//* ssh.deletedir ("/home/tfxiaozi/webapp1", true); */// Berikut ini akan didekompresi ke direktori WebApp1, Webapp1/test/xxx //ssh.execcommand("unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1 ", benar); // Berikut ini akan didekompresi ke/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 (); } Di atas adalah menggunakan Linux untuk beroperasi secara langsung, tetapi harus dicatat bahwa untuk file -file Cina, ketika dekompresi, mungkin ada kode yang kacau saat lulus, dan parameter perlu ditambahkan, seperti unzip -o cp936 test.zip -d/home/tfxiaozi/uji.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.