Загрузка и загрузка файлов сервера через SSH
Слова, написанные спереди
Ранее я записал метод для загрузки и загрузки файлов сервера с помощью компонента FTP с открытым исходным кодом Apache, но позже я обнаружил, что при удалении будут некоторые проблемы с разрешением, что приведет к невозможности удаления файлов на сервере. Несмотря на то, что после настройки разрешений на чтение и записи разрешений с использованием сервера Filezilla Server не возникает никаких проблем, его все еще немного сложно использовать на стороне сервера.
Поскольку мне необходимо реализовать функции управления ресурсами, в дополнение к хранилищу отдельных файлов FASTDFS, некоторое хранилище определенных ресурсов по -прежнему планируется временно храниться на сервере. Коллеги команды проекта заявили, что они не будут открывать услуги FTP специально на сервере позже, поэтому они изменились на режим SFTP для работы.
Как использовать эту вещь
Во -первых, вам нужно скачать пакет JSCH JAR, адрес: http://www.jcraft.com/jsch/. Веб -сайт также очень четко пишет: JSCH - это чистая Java -реализация SSH2. Это чистая Java реализация SSH2. Используйте IP и порт, введите имя пользователя и пароль, и вы можете использовать его обычно, что совпадает с методом использования безопасного CRT. Итак, как вы используете этот полезный инструмент?
На самом деле, не имеет значения, если вы не можете это написать. Чиновник также привел пример. Ссылка: http://www.jcraft.com/jsch/examples/shell.java. Давайте посмотрим:
/* -* -режим: java; C-Basic Offset: 2; Mode-Tabs-Mode: nil-*-*// ***Эта программа позволяет вам подключаться к SSHD-серверу и получить подсказку Shell. * $ Classpath =.: ../ Построение javac shell.java * $ classpath =.: ../ Создание Java Shell * Вам будет спросить имя пользователя, имя хоста и passwd. * Если все работает нормально, вы получите приглашение оболочки. Выход может быть * уродливой из-за отсутствия терминальной-вдувной, но вы можете выпустить команды. **/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.SETSOWSHOSTS("/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 (пользователь, хост, 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 = {"yes", "no"}; int foo = joptionpane.showoptiondialog (null, сообщение, «предупреждение», joptionpane.default_option, joptionpane.warning_message, null, опции, параметры [0]); вернуть foo == 0; } // Если пароль не будет предоставлен до вызова сеанса#connect (), // реализация также следующие методы, // * userInfo#getPassword (), // * userInfo#rasforpassword (строковое сообщение) и // * uikeyboardInteractive#rasforkeyboardinteractive ()}; session.setuserinfo (UI); // это не должно быть рекомендовано, но если вы хотите пропустить чек на хост-ключ, // вызвать следующее, // session.setConfig («StricthostKeyChecking», «Нет»); //session.connect (); Session.connect (30000); // Создание связи с тайм -аутом. Канал канал = session.openchannel ("shell"); // Включение агента-переполнения. //((ChannelShell) Cannel).setAgentForwarding(True); Channel.setInputStream (System.in); /* // Хак для приглашения MS-DOS в Windows. Channel.setInputStream (New FilterInputStream (System.in) {public int Read (byte [] b, int off, int len) бросает ioException {return in.read (b, off, (len> 1024? 1024: len));}}); */ channel.setOutputStream (System.out); /* // Выберите Pty-Type "VT102". ((Cannelshell) канал) .setPtyType ("VT102"); * / /* // Установить переменную среды "lang" как "ja_jp.eucjp". ((Cannelshell) канал) .setenv ("lang", "ja_jp.eucjp"); *///channel.connect (); канал. Concect (3*1000); } catch (Exception e) {System.out.println (e); }} public Static Abstract Class MyuserInfo реализует userInfo, uikeyboardinteractive {public String getPassword () {return null; } public boolean promptyesno (string str) {return false; } public String getPassphrase () {return null; } public boolean acmorgePassPhrase (String Message) {return false; } public boolean rasticspassword (строковое сообщение) {return false; } public void showmessage (string message) {} public String [] rasstekKeyboardInteractive (строка назначения, имя строки, инструкция строки, string [] reffice, boolean [] echo) {return null; }}}В этом коде мы можем увидеть, что нам нужно. Во -первых, нам нужно создать информацию пользователя. Это в основном используется для аутентификации. Просто реализуйте два интерфейса пользователя и uikeyboardinteractive. Затем, создав сеанс сеанса, установите userInfo In и, наконец, подключите.
Загрузка и загрузка файлов
Выше приведено основной метод использования JSCH, то есть некоторые основные процедуры. Давайте инкапсулируем функции, которые мы хотим использовать, реализовать серию операций, такие как загрузка и загрузка файлов.
Во -первых, создайте userInfo:
открытый класс myuserinfo реализует userinfo, uikeyboardinteractive {public String getPassword () {return null; } public boolean promptyesno (string str) {return true; } public String getPassphrase () {return null; } public boolean acmorgePassPhrase (String Message) {return True; } public boolean rasmespassword (строковое сообщение) {return true; } public void showmessage (string message) {} @Override public String [] rasforkkeyboardInteractive (String Arg0, String Arg1, String Arg2, String [] arg3, boolean [] arg4) {return null; }}Вот класс реализации:
Пакет 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.jraft.jcranceex; com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; импорт com.jcraft.jsch.jschexception; import com.jcraft.jsch.session; импорт com.jcraft.jsch.sftpexception; импорт com.jcraft.jsch.sftppressmonitor;/** ** * Ssh {logger logger = logger.getLogger (this.getClass ()); Private String host = ""; Private String user = ""; частный порт int = 22; Private String Password = ""; Private Static Final String Protocol = "sftp"; Jsch jsch = new jsch (); частная сессия; Частный канал канал; частные каналы 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 = пароль; this.port = порт; } / ** * Подключить ssh * @Throws JSchException * / public void connect () бросает JSchException {if (session == null) {session = jsch.getSession (user, host, port); Myuserinfo ui = new myuserinfo (); session.setuserinfo (UI); session.setpassword (пароль); session.connect (); Channel = session.openchannel (протокол); channel.connect (); sftp = (канал канала); }} / ** * Отсоедините ssh * / public void dindonce () {if (session! = null) {session.disconnect (); session = null; }} / ** * upload * @param localfilename * @param remotefilename * @return * / public boolean upload (string localfilename, string remotefilename) бросает исключение {boolean bsucc = false; try {sftpprogressmonitor monitor = new myProgressmonitor (); int mode = channelsftp.overwrite; sftp.put (localfilename, remotefilename, монитор, режим); bsucc = true; } catch (Exception e) {logger.error (e); } наконец {if (null! = Channel) {cannel.disconnect (); }} return bsucc; } / ** * Удалить файл * @param Directory * @param filename * @return * / public boolean detectefile (string directory, string filename) {boolean flag = false; try {sftp.cd (каталог); sftp.rm (имя файла); flag = true; } catch (sftpexception e) {flag = false; logger.error (e); } вернуть флаг; } / ** * Удалить каталог * @param Directory Dir Delete * @param Конечно, обязательно удалить * @return * / public String letetedir (string Directory, boolean sure) {string command = "rm -rf" + Directory; String result = execcommand (command, true); результат возврата; }/** * Сжатие файлов и подмоток каталога в Zip с именем CompressName * @param каталог контента для сжатия * @param compressname имени в каталоге после того, как он сжат * @throws sftpexception * @Usage ssh.compressdir ("/home/tfxiaozi/webappexception * @Usage"); */public void compressdir (string directory, string compressname) throws sftpexception {string command = "cd" + каталог + "/nzip -r" + compressName + "./" + compressName.substring (0, compressName.lastIndexof (".")); execcommand (command, true); } / ** * Скачать * @param localfilename * @param remotefilename * @return * / public boolean загрузка (строка Localfilename, String remoteFilename) {boolean bsucc = false; Канал канал = null; try {sftpprogressmonitor monitor = new myProgressmonitor (); sftp.get (remotefilename, localfilename, monitor, channelsftp.overwrite); bsucc = true; } catch (Exception e) {logger.error (e); } наконец {if (null! = Channel) {cannel.disconnect (); }} return bsucc; } / ** * execute command * @param Command * @param flag * @return * / public String execcommand (строка команда, Boolean Flag) {Channel = null; InputStream in = null; StringBuffer SB = new StringBuffer (""); try {channel = session.openchannel ("exec"); System.out.println ("Команда:" + Команда); (((ChannelExec) канал) .setCommand ("Экспортный термин = ansi &&" + command); ((ChannelExec) канал) .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); } наконец {if (channel! = null) {cannel.disconnect (); }} return sb.toString (); } / ** * Получить информацию CPU * @return * / public String [] getCpuInfo () {Channel = null; InputStream in = null; StringBuffer SB = new StringBuffer (""); try {channel = session.openchannel ("exec"); (((ChannelExec) канал) .setCommand ("Экспортный термин = ansi && top -bn 1"); // ansi должен добавить in = channel.getInputStream (); ((ChannelExec) канал) .seterRStream (System.err); channel.connect (); byte [] tmp = новый байт [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); } наконец {if (channel! = null) {cannel.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"); } / ** * Получите Hard Disk Info * @return * / public String getharddiskinfo () бросает исключение {канал канала = null; InputStream in = null; StringBuffer SB = new StringBuffer (""); try {channel = session.openchannel ("exec"); (((ChannelExec) канал) .setCommand ("df -lh"); in = channel.getInputStream (); ((ChannelExec) канал) .seterRStream (System.err); channel.connect (); byte [] tmp = новый байт [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) {бросить новое runtimeexception (e); } наконец {if (channel! = null) {cannel.disconnect (); }} String buf = sb.toString (); String [] info = buf.split ("/n"); if (info.length> 2) {// первая строка: используется размер файловой системы. для (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] + "используется," + result [3] + "free"; перерыв; } 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 не удалось ......"); возврат -1; } String [] diskinfo = harddiskinfo.replace ("", "") .split (","); if (diskinfo == null || diskinfo.length == 0) {logger.error ("Получить бесплатный диск. возврат -1; } String free = diskinfo [2]; free = free.substring (0, free.indexof ("free")); //System.out.println("free space: " + бесплатно); String Unit = free.substring (free.length ()-1); //System.out.println("unit: " + int); 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; } return 0; } / ** * Получить все подкаталоги и файлы в указанном каталоге * @param Directory * @return * @Throws Exception * / @SuppressWarnings ("ravtypes") Общедоступный <string> listfiles (string Directory) THRES Exception {vector filelist = null; List <string> filenamelist = new ArrayList <string> (); fileList = sftp.ls (каталог); Итератор IT = fileList.iterator (); while (it.hasnext ()) {string fileename = ((Cannelsftp.lsentry) it.next ()). getFilename (); if (filename.startswith (".") || filename.startswith ("..")) {продолжить; } filenamelist.add (имя файла); } return fileNamelist; } public boolean mkdir (String Path) {boolean flag = false; try {sftp.mkdir (path); flag = true; } catch (sftpexception e) {flag = false; } вернуть флаг; }}Проверьте это
public static void main (string [] arg) бросает исключение {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 (). Заменить ("", "")); //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.setfileneMeencoding("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 ("Извлечение не удалось ...."); }*//*String command = "rm -rf/home/tfxiaozi/webApp1/" + "Чернила и стирания китайских исследований"; String sss = ssh.execcommand (command, true); System.out.println (sss);*//*String findcommand = "find/home/tfxiaozi/webapp1/чернила и стирания китайских исследований index.html '"; String result = ssh.execcommand (findcommand, true); System.out.println (result);* / /*string path = ""; ssh.list -files (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/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.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.