Serverdatei hochladen und über SSH herunterladen
Wörter vorne geschrieben
Ich habe zuvor eine Methode zum Hochladen und Herunterladen von Serverdateien mithilfe der FTP Open Source -Komponente von Apache aufgezeichnet. Später stellte ich jedoch fest, dass beim Löschen einige Berechtigungsprobleme auftreten, was dazu führt, dass die Dateien auf dem Server nicht gelöscht werden können. Obwohl nach dem Einstellen von Lese- und Schreiben von Berechtigungen unter Verwendung von FileZilla Server unter Windows kein Problem besteht, ist es auf der Serverseite immer noch schwierig, sie zu verwenden.
Da ich neben der FastDFS -Speicherung einzelner Dateien Ressourcenverwaltungsfunktionen implementieren muss, ist eine gewisse Speicherung bestimmter Ressourcen weiterhin vorübergehend auf dem Server gespeichert. Die Kollegen des Projektteams sagten, dass sie FTP -Dienste später nicht speziell auf dem Server öffnen würden, sodass sie in den SFTP -Modus geändert wurden, um zu arbeiten.
Wie man dieses Ding benutzt
Zunächst müssen Sie das JSCH JAR -Paket herunterladen. Die Adresse lautet: http://www.jcraft.com/jsch/. Die Website schreibt auch sehr deutlich: JSCH ist eine reine Java -Implementierung von SSH2. Dies ist eine reine Java -Implementierung von SSH2. Verwenden Sie IP und Port, geben Sie den Benutzernamen und das Kennwort ein und Sie können es normal verwenden, was der Nutzungsmethode für sichere CRT entspricht. Wie verwenden Sie dieses nützliche Tool?
Eigentlich spielt es keine Rolle, ob Sie es nicht schreiben können. Der Beamte gab auch ein Beispiel. Der Link ist: http://www.jcraft.com/jsch/examples/shell.java. Schauen wir uns an:
/* -* -Modus: Java; C-Basic-Offset: 2; INGAPT-TABS-MODE: NIL-*-*// ***Mit diesem Programm können Sie eine Verbindung zum SSHD-Server herstellen und die Shell-Eingabeaufforderung abrufen. * $ ClassPath = .: ../ Javac Shell.java * $ classPath = .: ../ Java Shell bauen * Sie werden Benutzername, Hostname und Passwd gefragt. * Wenn alles gut funktioniert, erhalten Sie die Shell -Eingabeaufforderung. Die Ausgabe kann aufgrund des Mangels an terminal-emulsionsfehlern hässlich sein, aber Sie können Befehle ausstellen. **/import com.jcraft.jsch.*; import java.awt.*; import javax.swing. //jschsch.setknowhosts("/home/foo/.sssh/Bous_hosts "); String host = null; if (arg.length> 0) {host = arg [0]; } else {host = joptionpane.showInputDialog ("Benutzername@hostname eingeben", System.getProperty ("user.name")+ "@LocalHost"); } String user = host.substring (0, host.indexof ('@')); host = host.substring (host.indexof ('@')+1); Sitzung Session = jsch.getSession (Benutzer, Host, 22); String passwd = joptionpane.showInputDialog ("Passwort eingeben"); Session.setPassword (Passwd); UserInfo ui = new MyUserInfo () {public void showMessage (String -Nachricht) {joptionpane.showMessagedialog (null, message); } public boolean Promptyesno (String -Nachricht) {Object [] options = {"yes", "nein"}; int foo = joptionpane.showoptionDialog (null, meldung, "warning", joptionpane.default_option, joptionpane.warning_message, null, Optionen, Optionen [0]); return foo == 0; } // Wenn das Kennwort nicht vor dem Einruf von Sitzung von Session#Connect (), // auch folgende Methoden implementiert wird, // * userInfo#getPassword (), // * userInfo#forderPassword (String -Nachricht) und // * uikeyboardInteraction#promptKeyboardinteraction ()}; Session.SetUserInfo (UI); // Es darf nicht empfohlen werden, aber wenn Sie Host-Key-Check überspringen möchten, rufen Sie die folgenden, // session.setconfig ("StrictHostKeychecking", "Nein"). //session.connect (); Sitzung.Connect (30000); // eine Verbindung mit Timeout herstellen. Channel Channel = Session.openchannel ("Shell"); // Agent-Forwarding aktivieren. //((Channelshell)Channel).Setagentforwarding(True); Channel.SetInputStream (System.in); /* // Ein Hack für MS-DOS-Eingabeaufforderung unter Windows. Channel.SetInputStream (neuer FilterInputStream (System.in) {public int read (byte [] b, int off, int len) löscht ioException {return in.read (b, aus, (len> 1024? 1024: len));}}); */ Channel.SetoutputStream (System.out); /* // Wählen Sie den Pty-Typ "vt102". ((ChannelShell) Kanal) .setPtyType ("vt102"); * / /* // Umgebungsvariable "Lang" als "Ja_jp.eucjp" festlegen. ((ChannelShell) Kanal) .setenv ("Lang", "Ja_JP.EUCJP"); *///channel.connect (); Channel.Connect (3*1000); } catch (Ausnahme e) {System.out.println (e); }} public static abstract class myUSerInfo implementiert UserInfo, uikeyboardInteractive {public String getPassword () {return null; } public boolean Promptyesno (String str) {return false; } public String getPsePhrase () {return null; } public boolean promptPassPhrase (String -Nachricht) {return false; } public boolean forderPassword (String -Nachricht) {return false; } public void showMessage (String -Nachricht) {} public String [] promptKeyboardInteractive (String -Ziel, String -Name, String -Anweisung, String [] Eingabeaufforderung, boolean [] echo) {return null; }}}In diesem Code können wir im Grunde sehen, was wir brauchen. Zunächst müssen wir Benutzerinformationen erstellen. Dies wird hauptsächlich zur Authentifizierung verwendet. Implementieren Sie einfach die beiden Schnittstellen von UserInfo und UikeyboardInteractiveActive. Stellen Sie dann durch das Erstellen einer Sitzungssitzung UserInfo ein und verbinden Sie sich schließlich.
Kapselige Datei hochladen und herunterladen
Das obige ist die grundlegende Verwendungsmethode von JSCH, dh einige grundlegende Routinen. Lassen Sie uns die Funktionen, die wir verwenden möchten, eine Reihe von Vorgängen wie Hochladen und Herunterladen von Dateien zusammenstellen.
Erstellen Sie zunächst ein UserInfo:
öffentliche Klasse MyUSerInfo implementiert UserInfo, uikeyboardInteractive {public String getPassword () {return null; } public boolean Promptyesno (String str) {return true; } public String getPsePhrase () {return null; } public boolean promptPasPhrase (String -Nachricht) {return true; } public boolean promptPassword (String -Nachricht) {return true; } public void showsMessage (String -Nachricht) {} @Override public string [] promptKeyboardInteractive (String arg0, String arg1, String arg2, String [] arg3, boolean [] arg4) {return null; }}Hier ist die Implementierungsklasse:
Paket com.tfxiaozi.common.utils; import Java.io.inputStream; Import Java.util.ArrayList; Import Java.util.iterator; import Java.util.list; Import Java.util.Vector; com.jcraft.jsch.channelexec; import com.jcraft.jsch.channelsftp; import com.jcraft.jsch.jsch; import com.jcraft.jsch.jschexception; importpexception; importpexception; 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 statische endgültige String -Protokoll = "SFTP"; JSCH JSCH = new JSCH (); private Sitzung; Privatkanalkanal; private sanalleftp SFTP; public String gethost () {return host; } public void Sethost (String Host) {this.host = host; } public String getUser () {Rückgabe des Benutzers; } public void setUser (String -Benutzer) {this.user = user; } public ssh () {} public ssh (String -Host, int Port, String -Benutzer, String -Passwort) {this.host = host; this.user = user; this.Password = Passwort; this.port = port; } / ** * ssh * @throws jSchException * / public void connect () löscht JSCHException {if (session == null) {session = jsch.getSession (Benutzer, Host, Port); Myuserinfo ui = new myuserinfo (); Session.SetUserInfo (UI); Session.setPassword (Passwort); Session.connect (); Channel = Session.openchannel (Protokoll); Channel.Connect (); SFTP = (Channelsftp) Kanal; }} / ** * dishonnect ssh * / public void disconnect () {if (session! = null) {session.disconnect (); Sitzung = NULL; }} / ** * upload * @param localFileName * @param remoteFileName * @return * / public boolean upload (String localFileName, String remoteFileName) löst eine Ausnahme {boolean bsucc = false aus; try {sftpprogressMonitor monitor = neuer MyProgressMonitor (); int modus = Channelsftp.overwrite; sftp.put (LocalFileName, RemoteFileName, Monitor, Modus); bsucc = true; } catch (Ausnahme e) {logger.Error (e); } endlich {if (null! = Kanal) {Channel.Disconnect (); }} return bsucc; } / ** * Datei löschen * @param Verzeichnis * @param Dateiname * @return * / public boolean detectefile (String -Verzeichnis, String -Dateiname) {boolean flag = false; try {sftp.cd (Verzeichnis); sftp.rm (Dateiname); Flag = wahr; } catch (sftpexception e) {flag = false; logger.Error (e); } Rückkehrflag; } / ** * Verzeichnis löschen * @Param -Verzeichnis. String result = execcommand (Befehl, true); Rückgabeergebnis; }/** * Komprimieren Sie die Dateien und das Unter-Dire des Verzeichnisses in einen Reißverschluss namens CompressName * @Param-Verzeichnis Das Content-Verzeichnis zum Kompress * @Param CompressName Der Name im Verzeichnis, nachdem es komprimiert ist */public void compressDir (String -Verzeichnis, String compressName) löst sftpexception {String capy = "cd" + Verzeichnis + "/nzip -r" + compressName + "./" + compressName.substring (0, compressName.lastindexof (". execcommand (Befehl, wahr); } / ** * download * @param localFileName * @param remoteFileName * @return * / public boolean download (String localFileName, String remoteFileName) {boolean bsucc = false; Channel Channel = null; try {sftpprogressMonitor monitor = neuer MyProgressMonitor (); sftp.get (RemoteFileName, LocalFileName, Monitor, Channelsftp.overwrite); bsucc = true; } catch (Ausnahme e) {logger.Error (e); } endlich {if (null! = Kanal) {Channel.Disconnect (); }} return bsucc; } / ** * Befehl ausführen * @param -Befehl * @param flag * @return * / public String execcommand (String -Befehl, boolean Flag) {Channel Channel = null; InputStream in = null; StringBuffer sb = new StringBuffer (""); try {Channel = session.openchannel ("exec"); System.out.println ("Befehl:" + Befehl); . ((Channelexec) Kanal) .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 (neuer String (TMP, 0, i)); } if (Channel.isclosed ()) {break; }}} in.close (); } catch (Ausnahme e) {logger.Error (e); } endlich {if (Channel! = null) {Channel.Disconnect (); }} return sb.toString (); } / ** * CPU -Info * @return * / public String [] getCpuInfo () {Channel Channel = null; InputStream in = null; StringBuffer sb = new StringBuffer (""); try {Channel = session.openchannel ("exec"); ((ChannelExec) Kanal) .setCommand ("exportieren = ansi && top -bn 1"); // ansi muss in = Channel.getInputStream () hinzufügen; ((Channelexec) Kanal) .Seterrstream (System.err); Channel.Connect (); byte [] tmp = neues byte [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (neuer String (TMP, 0, i)); } if (Channel.isclosed ()) {break; }}} catch (Ausnahme e) {logger.Error (e); } endlich {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"); } / ** * Hartplatteninfo * @return * / public String getharddiskinfo () löst eine Ausnahme aus {Channel Channel = null; InputStream in = null; StringBuffer sb = new StringBuffer (""); try {Channel = session.openchannel ("exec"); ((Channelexec) Kanal) .setCommand ("df -lh"); in = Channel.GetInputStream (); ((Channelexec) Kanal) .Seterrstream (System.err); Channel.Connect (); byte [] tmp = neues byte [10240]; while (true) {while (in.available ()> 0) {int i = in.read (tmp, 0, 10240); if (i <0) {break; } sb.append (neuer String (TMP, 0, i)); } if (Channel.isclosed ()) {break; }}} catch (Ausnahme E) {neue runTimeException (e) werfen; } endlich {if (Channel! = null) {Channel.Disconnect (); }} String buf = sb.toString (); String [] info = buf.split ("/n"); if (info.length> 2) {// Erste Zeile: Dateisystemgröße verwendet UVIGE VERWENDUNG VER UNTERGRÜNDET IGHT IGTED AUF STRING TMP = ""; für (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] + "Gesamt" + result [2] + "verwendet" + result [3] + "Free"; brechen; } else {buf = ""; }}}} else {buf = ""; } return buf; } / ** * Gibt die Anzahl der kostenlosen Bytes zurück * @return * @throws Exception * / public double getfreedisk () löst eine Ausnahme aus {String harddiskinfo = getharddiskinfo (); if (harddiskinfo == null || harddiskinfo.equals ("") {logger.Error ("Freie Harddisk -Space fehlgeschlagen ......"); Return -1; } String [] diskinfo = harddiskinfo.replace ("", "") .split (","); if (diskinfo == null || diskinfo.length == 0) {logger.Error ("kostenlose Festplatteninformationen fehlgeschlagen ......"); 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: " + Einheit); 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; } / ** * Erhalten Sie alle Subdirektorien und Dateien im angegebenen Verzeichnis * @param Verzeichnis * @return * @throws Exception * / @Suppresswarnings ("rawttypes") publiclist <string> listFiles (String -Verzeichnis) löst Ausnahme {vector filelist = null aus; Liste <String> filenamelist = new ArrayList <string> (); filelist = sftp.ls (Verzeichnis); Iterator it = filelist.Iterator (); while (it.hasnext ()) {String fileName = ((Channelsftp.lsentry) it.next ()). getFileName (); if (Dateiname.StartsWith (".") || Dateiname.Startswith ("..")) {Fortsetzung; } filenamelist.add (Dateiname); } return filenamelist; } public boolean mkdir (String -Pfad) {boolean flag = false; try {sftp.mkdir (path); Flag = wahr; } catch (sftpexception e) {flag = false; } Rückkehrflag; }}Testen Sie es
public static void main (String [] arg) löst eine Ausnahme aus (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 (Ausnahme 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 (). Ersetzen ("", ""); //System.out.println (ssh.getfreedisk ()); /*List <string> list = ssh.listfiles ("webapp/test"); für (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 (Ausnahme e) {System.out.println (e.getMessage ()); }*///sssh.sftp.setFileNameEneCoding("UTF-8 "); /*try {string ss = ssh.execcommand ("unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1/", true); System.out.println (SS); } catch (Ausnahme e) {System.out.println (e.getMessage ()); }*//*String path = "/home/tfxiaozi/webapp1/test.zip"; try {list <string> list = ssh.listfiles (Path); für (String S: List) {System.out.println (s); } System.out.println ("OK"); } catch (Ausnahme e) {System.out.println ("Extrakt fehlgeschlagen ...."); }*//*String command = "rm -rf/home/tfxiaozi/webapp1/" + "tinte und waschen chinesische Studien"; String SSS = ssh.execcommand (Befehl, true); System.out.println (SSS);*//*String findCommand = "find/home/tfxiaozi/webapp1/tinte und waschen chinesische Studienname 'index.html'"; String result = ssh.execcommand (findCommand, true); System.out.println (Ergebnis);* / /*String path = ""; ssh.listfiles (remotepath);*//* ssh.deletedir ("/home/tfxiaozi/webapp1", true); */// Folgendes wird in das WebApp1 -Verzeichnis, webapp1/test/xxx //ssh.execcommand("unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1 ", dekomprimiert. // Folgendes wird auf/webapp1/test/test/xxx //ssh.execcommand("unzip /home/tfxiaozi/webapp1/test.zip -d/home/tfxiaozi/webapp1 "dekomprimiert. //sssh.compressdir("/home/tfxiaozi/webapp1 "," test.zip "); //ssh.sftp.cd("/home/tfxiaozi/webapp1 "); //sssh.compressdir("/home/tfxiaozi/webapp1 "," test.zip "); /*boolean b = ssh.download ("d: /temp/test.zip", "webapp/test.zip"); System.out.println (b);*///sssh.GethardDiskinfo (); System.out.println (ssh.getfreederisk ()); ssh.disconnect (); } Das obige soll Linux direkt arbeiten, aber es ist zu beachten, dass bei der Dekomprimierung chinesischer Dateien beim Eingeben möglicherweise ein verstümmelter Code vorliegt und Parameter hinzugefügt werden müssen, wie z.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.