# FTP-Connection über FTP-Proxy



## MatthiasH (28. Jul 2009)

Ich versuche verzweifelt eine FTP-Connection über ein FTP-Proxy hinzukriegen.

Die FTP-Connection an sich klappt, dass konnte ich ohne Umweg übers Proxy testen.
Doch hier in der Firma muss ich zwangsweise über das FTP-Proxy, da ich sonst auf der Firewall lande.

Ich habe schon vieles probiert mit den FTP libaries von jakarta und ftp4j.

Die Proxies hab ich in jeder erdenklichen Weise schon über System.setProperties gesetzt, doch ich lande immer wieder auf der Firewall.....

hier mal der code mit der jakarta ftp libary:


```
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
import org.apache.commons.net.ftp.FTPReply;


public class ftpClient1
{

    public static final void main(String[] args)
    {
        boolean error = false;
        String server, username, password;
        FTPClient ftp;
        String proxyHost = "XXXXXXXXXXX";
	    String proxyPort = "XXXX";
	    
	    System.setProperty("ftp.proxySet","true");
		System.setProperty("ftp.proxyHost",proxyHost);
		System.setProperty("ftp.proxyPort",proxyPort);
//		System.setProperty("ftp.nonProxyHosts",proxyHost);
		
		System.setProperty("ftpProxySet","true");
		System.setProperty("ftpProxyHost",proxyHost);
		System.setProperty("ftpProxyPort",proxyPort);
//		System.setProperty("ftp.nonProxyHosts",proxyHost);
		
//		System.setProperty("http.proxySet","true");
//		System.setProperty("http.proxyHost",proxyHost);
//		System.setProperty("http.proxyPort",proxyPort);
//		System.setProperty("http.nonProxyHosts",proxyHost);
		
//		System.setProperty("proxySet","true");
//		System.setProperty("proxyHost",proxyHost);
//		System.setProperty("proxyPort",proxyPort);
//		System.setProperty("nonProxyHosts",proxyHost);
		
//		System.setProperty("socksProxySet","true");
//		System.setProperty("socksProxyHost",proxyHost);
//		System.setProperty("socksProxyPort",proxyPort);
		
        server = "XXXX";
        username = "XXXX";
        password = "XXXX";

        ftp = new FTPClient();
//        ftp.enterLocalPassiveMode();
//        ftp.setRemoteVerificationEnabled(false);  
        ftp.addProtocolCommandListener(new PrintCommandListener(
                                           new PrintWriter(System.out)));
        try
        {
            int reply;
            ftp.connect(server);
            System.out.println("Connected to " + server + ".");

            reply = ftp.getReplyCode();

            if (!FTPReply.isPositiveCompletion(reply))
            {
                ftp.disconnect();
                System.err.println("FTP server refused connection.");
                System.exit(1);
            }
        }
        catch (IOException e)
        {
            if (ftp.isConnected())
            {
                try
                {
                    ftp.disconnect();
                }
                catch (IOException f)
                {
                    // do nothing
                }
            }
            System.err.println("Could not connect to server.");
            e.printStackTrace();
            System.exit(1);
        }

__main:
        try
        {
            if (!ftp.login(username, password))
            {
                ftp.logout();
                error = true;
                break __main;
            }

            System.out.println("Remote system is " + ftp.getSystemName());

            
            ftp.enterLocalPassiveMode();


            ftp.logout();
        }
        catch (FTPConnectionClosedException e)
        {
            error = true;
            System.err.println("Server closed connection.");
            e.printStackTrace();
        }
        catch (IOException e)
        {
            error = true;
            e.printStackTrace();
        }
        finally
        {
            if (ftp.isConnected())
            {
                try
                {
                    ftp.disconnect();
                }
                catch (IOException f)
                {
                    // do nothing
                }
            }
        }

        System.exit(error ? 1 : 0);
    } // end main

}
```


Mit dem ftp.connect() lande ich wie gesagt auf der Firewall und da schlägt der Login natürlich fehl.... bei den meisten meiner Versuche habe ich dann folgenden Fehler bekommen beim ftp.login():

421-Access denied - wrong user name or password 

org.apache.commons.net.ftp.FTPConnectionClosedException: FTP response 421 received.  Server closed connection.

Hoffe mir kann da jemand helfen.

Java: JSE6
BS: Mac OS X Leopard

In den Proxysettings von Leopard hab ich auch rumgewerkelt.
FTP-Proxy an/aus - FTP als Ausnahme und wieder raus usw.

Aber es geht einfach nicht...
Hoffe es kann mir jemand helfen..

gruß
Matthias


----------



## sparrow (28. Jul 2009)

MatthiasH hat gesagt.:


> 421-Access denied - wrong user name or password



Das scheint aber nicht so als würdest du an der Firewall scheitern, das scheint eher so als benötigt der Proxy ebenfalls Benutzername und Passwort, nicht nur der FTP-Server.


----------



## MatthiasH (29. Jul 2009)

Man hat mir versichert, dass man beim Proxy keine Authentifizierung benötigt....

Außerdem bekomme ich die selbe Fehlermeldung, wenn ich keinerlei FTP-Proxy angebe (weder in der JVM noch in den Systemeinstellungen).

Und als FTP Reply nach dem Connect kriege ich folgendes zurück:
220 Check Point FireWall-1 Secure FTP server running on XXX

Heisst wohl, dass er das FTP-Proxy so wie ich es angegeben habe nicht erkennt....

Hab mich auch schon totgegoogled nach ner Lösung, aber erfolglos :-/


----------



## sparrow (29. Jul 2009)

Was ist das denn für ein Proxy? Zufällig Squid?
Ich kenne FTP-Proxys vor allem so, dass sie gegenüber dem Client meist HTTP sprechen.
Das heißt: der Proxy empfängt entsprechende Daten vom FTP-Server und bereitet die dann entsprechend optisch mit Hilfe von HTML auf und sendet das an den Client.


----------



## MatthiasH (29. Jul 2009)

Es ist ein richtiger FTP-Proxy... also ein Frox-Proxy...



> Ich kenne FTP-Proxys vor allem so, dass sie gegenüber dem Client meist HTTP sprechen.



Ja sowas ähnliches habe ich auch gelesen....
aber was heisst das jetzt für mich....???
muss ich den ftp über http ansprechen und das ftp-proxy als http-proxy angeben?
URL url = new URL("ftp://usernameassword@ftp.whatever.com/file.zip") ???

nur über http kann ich ja dann keine befehle wie list abrufen, was ich eigentlich für meine zwecke bräuchte....!?


----------



## MatthiasH (30. Jul 2009)

Kann das sein, dass es gar nicht geht mit Java eine FTP-Connection über ein FTP-Proxy aufzubauen???

Ich lese nämlich immer nur von HTTPTunnel und SocksProxy.....

Scheint so als würde keine ftp-libary so wirklich das Connecten über FTP-Proxies supporten...


----------



## HoaX (4. Aug 2009)

Am besten du fragst mal den Admin des FTP-Proxies wie dieser heißt und funktioniert und leitest das an uns weiter ...


----------



## EuropaChat (4. Aug 2009)

Sorry, wollte dir helfen, aber wurde gerade in einem anderen Forum gesperrt, dort habe ich deine Frage gepostet, und in diesem Forum kann man Bits sammeln. Nun meinen sie das ich Bits sammeln wollte. Naja vllt. antwortet doch noch jemand auf diesen Beitrag.

Ich Google nun mal, vllt. komm ich ja auf die Lösung.


----------



## HoaX (4. Aug 2009)

EuropaChat hat gesagt.:


> Sorry, wollte dir helfen, aber wurde gerade in einem anderen Forum gesperrt, dort habe ich deine Frage gepostet, und in diesem Forum kann man Bits sammeln. Nun meinen sie das ich Bits sammeln wollte. Naja vllt. antwortet doch noch jemand auf diesen Beitrag.
> 
> Ich Google nun mal, vllt. komm ich ja auf die Lösung.


Hä?


----------



## MatthiasH (5. Aug 2009)

> Am besten du fragst mal den Admin des FTP-Proxies wie dieser heißt und funktioniert und leitest das an uns weiter ...



Es ist ein Frox Proxy...

und über den funktioniert nur FTP im passiven Modus, sonst öffnet der proxy nen anderen channel und ich lande auf unserer Firewall.


----------



## HoaX (7. Aug 2009)

Frox? Du meinst sicherlich Socks4/5?!

Edit: Ok, grad mal gegooglet ... gibt wohl wirklich einen FTP-Proxy der Frox heißt ...


----------



## HoaX (7. Aug 2009)

Auf der Seite Frox transparent ftp-proxy home page steht dass es ein transparenter Proxy ist. D.h. es ist nicht die Aufgabe deines Programms dich darüber zu verbinden, sondern dein Admin muss sich darum kümmern dass der Traffic darüber geleitet wird. Evtl. wird es das ja schon, da es ja ohne geht wie du sagst.

Hätte mich auch gewundet wenn es anders wäre, denn innerhalb des FTP-Protokolls wird im Gegensatz zu HTTP nicht nochmal der Hostname/IP des Server gesendet. D.h. der Proxy hätte nie gewusst wohin die Verbindung hätte gehen sollen.


----------



## Vamp898 (7. Aug 2009)

Ich denke das hier hilft dir weiter

QNetworkProxy

Und das hier vllt. noch: 

QFtp

Edit: Dazu brauchst halt das "allmächtige" Qt-Toolkit =)

Qt Jambi Reference Documentation

Für mehr informationen


----------



## HoaX (7. Aug 2009)

Vamp898 hat gesagt.:


> Ich denke das hier hilft dir weiter
> 
> QNetworkProxy
> 
> ...



Ich denke ehr nicht, wegen von mir genanntem Punkt mit dem Hostnamen und der Tatsache dass es kein Socks-Proxy ist.


----------



## Vamp898 (7. Aug 2009)

Es muss kein Socks-Proxy sein

QNetworkProxy.ProxyType


----------



## MatthiasH (10. Aug 2009)

Hm ich hab es mal mit QFtp probiert,


```
QNetworkProxy proxy = new QNetworkProxy();
	        proxy.setHostName(proxyHost);
	        proxy.setPort(proxyPort);
	        proxy.setType(com.trolltech.qt.network.QNetworkProxy.ProxyType.FtpCachingProxy);
	        
	        QFtp ftp = new QFtp();
	        ftp.connectToHost(server);
	        ftp.login(username, password);
	        ftp.setTransferMode(TransferMode.Passive);
```

nachdem es erstmal nur in JSE 5 mit 32 bit lief

krieg ich nun beim connectToHost():



> QObject::startTimer: QTimer can only be used with threads started with QThread



hat nicht jemand ein Beispiel für QFTP in Java, ich habe dazu nichts gefunden :-/ ??


----------



## HoaX (10. Aug 2009)

Wieso bastelst du da immernoch dran rum? Es ist ein transparenter Proxy, der sollte ohne dein zutun machen was er soll!?
Zu QFtp wird dir nur Vamp898 oder die Doku weiterhelfen können...


----------



## Vamp898 (10. Aug 2009)

das QNetworkProxy kannst du dir durch das hier sparen =)

QFtp

Ich bräucht evtl. den ganzen source + die genaue fehlermeldung um zu sagen was da schief gelaufen ist. Weil bei mir funktionierts wenn ichs genau so mache wie du^^

Das hier ist das Beispielprogramm aus der API


```
ftp.connectToHost("ftp.trolltech.com");
    ftp.login();
    ftp.cd("qt");
    ftp.get("INSTALL");
    ftp.close();
```


----------



## MatthiasH (11. Aug 2009)

```
import java.io.IOException;
import java.io.PrintWriter;

import com.trolltech.qt.network.QFtp;
import com.trolltech.qt.network.QNetworkProxy;
import com.trolltech.qt.network.QFtp.TransferMode;

public class qFTP 
{

	
	public static final void main(String[] args)
    {
        
		String server, username, password;
        String proxyHost = "XXXXXXXXX";
	    String proxyPort = "XXXX";
		
        server = "XXXXXXXXXX";
        username = "XXXXXXX";
        password = "XXXXXXX";
        try
        {
	        QFtp ftp = new QFtp();
                System.out.println("Setting Proxy...");
	        ftp.setProxy(proxyHost, proxyPort);
	        System.out.println("Trying to connect...");
	        ftp.connectToHost(server);
	        System.out.println("Trying to login...");
	        ftp.login(username, password);
	        System.out.println("Login successful...");
	        ftp.setTransferMode(TransferMode.Passive);
        }
        catch (Exception e)
        {
        	e.printStackTrace();
        }

    }
}
```

ohne -XstartOnFirstThread:


> WARNING!!
> 
> 
> Qt Jambi does not appear to be running on the main thread and will most likely be unstable and crash. Please make sure to launch your 'java' command with the '-XstartOnFirstThread' command line option. For instance:
> ...




mit -XstartOnFirstThread:


> Setting Proxy...
> QObject::startTimer: QTimer can only be used with threads started with QThread
> Trying to connect...
> Trying to login...
> Login successful




alles mit JRE 1.5 in MAC OS X 10.5


EDIT: hab noch ein paar state() eingbaut >>>> jederzeit unconnected
errorString() nach dem connectToHost() gibt >>>> Unknown Error


----------



## MatthiasH (11. Aug 2009)

Hm also ich habs mal über Kommandozeile versucht...

da komm ich folgenderweise klar:



> ftp> open proxyHost proxyPort
> Connected to proxyHost
> 220 Ready
> Name : User@Server
> ...



ohne den extended passive mode (epsv4) wird die verbindung geschlossen....


----------



## HoaX (11. Aug 2009)

Was hält dich jetzt davon am Qt Qt sein zu lassen, dein altes funktionierendes Programm zu nehmen, da du den Proxy nicht setzen brauchst, und glücklich zu sein?!


----------

