【问题标题】:FTP connect with no username and password?FTP连接没有用户名和密码?
【发布时间】:2016-11-18 17:46:29
【问题描述】:

您好,我已经使用URLConnection 连接到 FTP,只使用了 IP 地址,没有指定登录凭据。

URLConnection conn = new URLConnection(new URL("ftp://222.101.102.1/etc"));

它可以工作,无需凭据,因为服务器可能允许匿名连接。

但为了练习,我想从头开始与Socket 客户端建立一个 ftp 连接,并且我创建了一个到该 IP 的新套接字连接:

Socket socket = new Socket("222.101.102.1", 21);
if (socket != null) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String version = reader.readLine();
    System.out.println(version);
}

这打印220 vsFTPd (2.0.5)

但是当我尝试像LS \r\n这样的命令时

我收到530 Please login with USER and PASS

如果URLConnection 没有登录,为什么要我登录?

此代码未编译,因为它是从我的另一台计算机上记住的,所以如果您发现有问题,请告诉我,我会立即进行编辑。

【问题讨论】:

  • IIRC,当你构建一个套接字时,你正在围绕一个协议构建整个工作,但你必须设置它如何通过该协议进行通信。当您构建 URLConnection 对象时,您正在创建一个已经内置了这些工作的对象。也就是说,URLConnection 知道如何连接和登录,但在你正在构建的 Socket 中,它只知道如何物理连接。它不知道下一步该做什么。
  • @blahfunk 这正是我需要的!我需要有关 URLConnection 是如何工作的信息,它使用什么作为默认连接凭据我从哪里获得该信息?人们说用户名是匿名的或 ftp 和密码作为电子邮件,但我们不在那里使用我不知道的电子邮件。

标签: java sockets ftp


【解决方案1】:

我设法弄明白了。

URL.openConnection() 基本上返回一个基于协议实现URLStreamHandler 的类。所以在这种情况下,协议是ftp,它返回FtpURLConnection

所以会检查用户名是否为空(未在 URL 中指定),如果是,则将其设置为匿名并使用带有 @ 的 java 版本的密码

例如 Java1.8.0@ 不确定是什么目的,可能是登录历史记录。 但是您可以使用任何密码以匿名方式登录,除非它配置为我认为的其他内容。

        if(this.user == null) {
            this.user = "anonymous";
            String var11 = (String)AccessController.doPrivileged(new GetPropertyAction("java.version"));
            this.password = (String)AccessController.doPrivileged(new GetPropertyAction("ftp.protocol.user", "Java" + var11 + "@"));
        }

所以我基本上是用Anonymous无密码登录的。

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2011-04-15
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2017-12-11
    相关资源
    最近更新 更多