Wie kann ich Zugriff auf einen FTP-server mit JSch?
Installierte ich FileZilla FTP-Server auf meinem lokalen Windows 7-Maschine.
Ich habe auch installiert FileZilla FTP-client auf der gleichen Maschine.
Verbindung wird erfolgreich zwischen den beiden von Ihnen mit der Bestätigung der server-und client-Partnerschaft besteht.
Schrieb ich einen kleinen, schnellen und dirtry Jsch-Programm für die Verbindung zum FileZilla FTP-server und unten ist das Programm:
public class TestJSch {
/** Creates a new instance of TestCommonsNet */
public TestJSch() {
}
/**
* main - Unit test program
*
* @param args
* Command line arguments
*
*/
public static void main(String[] args) {
try {
String ftpHost = "127.0.0.1";
int ftpPort = 21;//14147;
//int ftpPort = 990;//14147;
String ftpUserName = "kedar";
String ftpPassword = "XXXXXXXXXXX";
String ftpRemoteDirectory = "C:\\KEDAR\\Java\\FTP_Folder";
String fileToTransmit = "C:\\KEDAR\\Java\\File_Folder\\Customer.txt";
String identityfile = "C:\\KEDAR\\Java\\Ftp\\certificate.crt";
//
//First Create a JSch session
//
JSch.setLogger(new MyLogger());
System.out.println("Creating session.");
JSch jsch = new JSch();
String knownHostsFilename = "C:\\Windows\\System32\\drivers\\etc\\hosts";
jsch.setKnownHosts(knownHostsFilename);
jsch.addIdentity(identityfile);
Session session = null;
Channel channel = null;
ChannelSftp c = null;
//
//Now connect and SFTP to the SFTP Server
//
try {
//Create a session sending through our username and password
session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
System.out.println("Session created.");
session.setPassword(ftpPassword);
//Security.addProvider(new com.sun.crypto.provider.SunJCE());
//b
//Setup Strict HostKeyChecking to no so we dont get the
//unknown host key exception
//
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
System.out.println("Session connected.");
//
//Open the SFTP channel
//
System.out.println("Opening Channel.");
channel = session.openChannel("sftp");
channel.connect();
c = (ChannelSftp) channel;
} catch (Exception e) {
System.err.println("Unable to connect to FTP server."
+ e.toString());
throw e;
}
//
//Change to the remote directory
//
System.out.println("Changing to FTP remote dir: "
+ ftpRemoteDirectory);
c.cd(ftpRemoteDirectory);
//
//Send the file we generated
//
try {
File f = new File(fileToTransmit);
System.out.println("Storing file as remote filename: "
+ f.getName());
c.put(new FileInputStream(f), f.getName());
} catch (Exception e) {
System.err
.println("Storing remote file failed." + e.toString());
throw e;
}
//
//Disconnect from the FTP server
//
try {
c.quit();
} catch (Exception exc) {
System.err.println("Unable to disconnect from FTPserver. "
+ exc.toString());
}
} catch (Exception e) {
System.err.println("Error: " + e.toString());
}
System.out.println("Process Complete.");
System.exit(0);
}
public static class MyLogger implements com.jcraft.jsch.Logger {
static java.util.Hashtable name = new java.util.Hashtable();
static {
name.put(new Integer(DEBUG), "DEBUG: ");
name.put(new Integer(INFO), "INFO: ");
name.put(new Integer(WARN), "WARN: ");
name.put(new Integer(ERROR), "ERROR: ");
name.put(new Integer(FATAL), "FATAL: ");
}
public boolean isEnabled(int level) {
return true;
}
public void log(int level, String message) {
System.err.print(name.get(new Integer(level)));
System.err.println(message);
}
}
}
Ich habe versucht mit diesem Programm, und unten ist das FTP-log:
(000033)9/12/2011 13:08:53 PM - (nicht eingeloggt) (127.0.0.1)> Connected, sending welcome message...
(000033)9/12/2011 13:08:53 Uhr - (nicht eingeloggt) (127.0.0.1)> 220-FileZilla Server version 0.9.39 beta
(000033)9/12/2011 13:08:53 Uhr - (nicht eingeloggt) (127.0.0.1)> 220-written by Tim Kosse ([email protected])
(000033)9/12/2011 13:08:53 Uhr - (nicht eingeloggt) (127.0.0.1)> 220 besuchen Sie Bitte http://sourceforge.net/projects/filezilla/
(000033)9/12/2011 13:08:53 Uhr - (nicht eingeloggt) (127.0.0.1)> SSH-2.0-JSCH-0.1.44
(000033)9/12/2011 13:08:53 Uhr - (nicht eingeloggt) (127.0.0.1)> 500 Syntax Fehler, Befehl nicht erkannt.
(000033)9/12/2011 13:09:54 Uhr - (nicht eingeloggt) (127.0.0.1)> 421 Login Zeit überschritten. Schließen die Verbindung.
(000033)9/12/2011 13:09:54 Uhr - (nicht eingeloggt) (127.0.0.1)> getrennt.
Ich verstehe nicht, warum der JSch-Programm ist die Erteilung SSH-2.0-JSCH-0.1.44
Befehl und die Kommunikation wird dann abgelehnt. Wie können wir diese vermeiden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
JSch ist nicht ein FTP-client. JSch ist ein SSH-client (mit integrierter SFTP-Implementierung).
Das SSH-Protokoll ist ein Protokoll, das sichere verbindungen zu einem server, für den shell-Zugriff, Datei-transfer oder port-Weiterleitung. Für diese muss auf dem server ein SSH-server (normalerweise auf port 22, aber das kann variieren). SFTP ist ein binary-file-transfer-Protokoll, welches wird in der Regel über SSH getunnelt, und nicht mit FTP (außer dem Namen).
Wenn Sie verwenden möchten JSch zum herunterladen/hochladen von Dateien, müssen Sie installieren und aktivieren Sie eine SSH - /SFTP-server auf Ihrem Rechner (bzw. der computer, den Sie zugreifen möchten).
Für FTP haben, müssen Sie auf andere Java-Bibliotheken (Apache Commons FTPClient scheint berühmt zu sein, von den Fragen hier).
Durch die Art und Weise, die bekannten hosts - Datei für JSch ist eine Datei mit einer Liste der öffentlichen Schlüssel des SSH-hosts, nicht die Datei mit einer Liste von IP-Adressen (das ist der Windows config Datei, die Sie versuchen zu liefern, hier).
Verwenden Apache-commons-net-FTP-Bibliothek.