FTP目录列表返回为HTML,而不是简单的Linux ls输出



(与如何强制C#FtpWebRequest使用直接IP而不是通过HTTP代理访问互联网有关?(

使用C#从FTP服务器获取目录列表。输出的格式为HTML。必需的是一个未格式化的列表(由Linux ls命令返回(。(尽量避免解析HTML以获取文件列表。(

观察结果:

  • FTP服务器是由客户端运行的vsftpd。

  • 在例如Filezilla FTP服务器上列出目录时不会出现此问题。

  • 连接到vsftpd服务器的Filezilla客户端在获取列出的目录时超时

    Error: Connection timed out Error: Failed to retrieve directory listing

参考下面的代码,会发生以下行为/错误:

  1. 何时代码中设置的代理服务器那么服务器返回HTML格式的列表,而不是简单的ls输出。

  2. 何时代理服务器设置为空或WebRequest.DefaultWebProxyGlobalProxySelection.GetEmptyWebProxy()new WebProxy();那么:The remote server returned an error: (550) File unavailable (e.g., file not found, no access).

  3. 何时:代码中未指定任何代理服务器AND proxy未设置为null。那么The remote server returned an error: (407) Proxy Authentication Required.

问题

  • 如何设置C#代码以获得ls目录列表而不是HTML?或
  • 在vsftpd(服务器(端有什么可以防止HTML目录列表的方法吗

详细信息:

代码提取

  FtpWebRequest request = WebRequest.Create(uri) as FtpWebRequest;
  request.Method = WebRequestMethods.Ftp.ListDirectory;
  //1. Works but returns HTML
  request.Proxy = new WebProxy("http://xxx.xxx.xxx.xxx:8080",true); 
  request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
  //2. Does not work
  //request.Proxy = null;// WebRequest.DefaultWebProxy;// GlobalProxySelection.GetEmptyWebProxy(); // null; //new WebProxy();
  request.Credentials = server.Credential;
  request.KeepAlive = true;
  request.UsePassive = true;
   FtpWebResponse response = (FtpWebResponse)request.GetResponse();
    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream);
    Regex filter = FileUtils.GetRegex(clientSource.FileFilter);
    while (!reader.EndOfStream)
    {
      ProcessFileLine(reader.ReadLine(), filter, files);
    }
    reader.Close();
    response.Close();

格式化为HTML 的目录列表

<HTML>
<meta http-equiv="Content-Type" content="text-html; charset=UTF-8">
<HEAD>
<TITLE>FTP root at ftp-jhb.saicomvoice.co.za. </TITLE>
</HEAD>
<BODY>
<H1>FTP root at ftp-jhb.saicomvoice.co.za. </H1>
<HR>
<PRE>
12/11/15 04:36PM [GMT]                      &lt;DIR&gt; <A     HREF="/bin/">bin</A>
12/11/15 12:56PM [GMT]                      &lt;DIR&gt; <A HREF="/boot/">boot</A>
02/22/13 12:00AM [GMT]                      &lt;DIR&gt; <A     HREF="/cgroup/">cgroup</A>
12/11/15 03:36PM [GMT]                      &lt;DIR&gt; <A HREF="/dev/">dev</A>
01/19/15 01:32PM [GMT]                      &lt;DIR&gt; <A HREF="/etc/">etc</A>
12/12/15 11:45AM [GMT]                      &lt;DIR&gt; <A HREF="/home/">home</A>
12/11/15 12:51PM [GMT]                      &lt;DIR&gt; <A </PRE>
<HR>
</BODY>
</HTML>

从描述中可以看出,您需要使用HTTP代理来访问FTP服务器。FTP协议不会访问代理,只转发命令,而是通过HTTP协议访问。然后,代理将为您执行必要的FTP命令,并在HTTP响应中为您返回结果。这个结果会是什么样子完全取决于代理。由于大多数用户都会使用浏览器访问HTTP代理,HTTP代理通常会返回一个带有结果的HTML页面,这样用户就可以从那里点击获取相关文件。

总之:由于结果完全取决于代理,因此只要您需要使用此特定代理,就无法以不同的方式获得结果。因此,最好与管理员核实是否有其他使用FTP的方法,即不使用此HTTP代理。

我发现了这段代码,它帮助了我:

request.Proxy = null;

最新更新