当前位置: 首页 > 知识库问答 >
问题:

FTP目录列表以超文本标记语言返回,而不是简单的Linuxls输出

端木兴国
2023-03-14

(关于如何强制C#FtpWebRequest使用直接IP而不是通过HTTP代理进入互联网?)

使用C#从FTP服务器获取目录列表。输出被格式化为超文本标记语言。必需是一个未格式化的列表(由Linuxls命令返回)。(试图避免解析超文本标记语言以获取文件列表。)

意见:

>

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

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

    获取目录列表时,连接到vsftpd服务器的Filezilla客户端超时

    错误:连接超时错误:检索目录列表失败

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

    >

  • 当代理服务器在代码中设置时,THEN服务器返回以超文本标记语言格式化的列表,而不是简单的ls输出。

    当代理服务器设置为null或WebRequest时。DefaultWebProxy全局Proxy选择。GetEmptyWebProxy()新建WebProxy() 然后:远程服务器返回错误:(550)文件不可用(例如,找不到文件,无法访问)

    时间:代码中没有指定的代理服务器AND代理未设置为null。然后远程服务器返回一个错误:(407)需要代理身份验证。

    问题

    • 如何设置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>
    

  • 共有2个答案

    柳逸春
    2023-03-14

    我找到了这个代码,它帮助了我:

    request.Proxy = null;
    
    澹台蕴藉
    2023-03-14

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

    总之:因为结果完全取决于代理,所以只要你需要使用这个特定的代理,就没有办法以不同的方式获得结果。因此,最好是与您的管理员检查是否有另一种使用FTP的方法,即没有这个HTTP代理。

     类似资料:
    • 我试图通过泽西客户端的Web服务获取一个对象,通过发送预注册ID作为路径变量的服务,在高级REST客户端和邮递员上测试它-它的工作原理,但当我通过泽西客户端从java代码使用Web服务时,我得到超文本标记语言返回而不是JSON。 这是密码 Web服务- 泽西客户- 通过邮递员和ARC消费web服务后- 如上图所示,通过jersey客户端使用web服务后,我得到的是HTML内容,而不是JSON- 然

    • 我在将一些客户端数据表逻辑迁移到服务器端时遇到了一些困难。 我当前的问题是,对于Datatables,如果要对一大组数据(20000行)进行分页,我首先需要加载控制器中的所有行,然后将它们传递给视图: 然后,在加载所有内容和Datatables将记录分页为500页之前,需要等待大约2分钟: 我更改了Datatables声明,以通过处理服务器端处理,如下所示: 让它按我所希望的方式工作非常顺利,但问

    • 我正在使用ITextRenderer从html生成PDF。然而,我得到以下异常: 你能帮帮我吗? 任何帮助都将不胜感激。 先谢谢你。

    • 出于某种原因,我通过POST提交的表单发送的是选项文本,而不是表单的选项值。这是我的选择声明: 当我用PHP打印我的$\u POST数组时。我有: 我对jquery特别陌生,我使用jquery以模态的方式呈现表单,因此我将粘贴下面的完整表单/div和javascript,以防相关: return_frequency()是一个php函数,根据输入返回“每2周”或“每周”。 我错过了什么?

    • 我在输入上使用typeahead发送建议。。一切都很好,但我知道我想动态创建HTML表并在表中赋值,所以在我的java脚本中,我声明HTML变量来存储表,然后在返回值时使用这个变量。当我将html保存在变量中时,问题就出现了,它开始给出错误,即变量未定义,当我将它放在引号中时,返回时,它只显示变量。。我不知道该怎么做,也不知道应该使用哪种方法,但我被困在了这一点上,我的HTML正在工作 这里是我的

    • 我在stackoverflow上看了其他一些答案,但没有找到一个回答我问题的答案。 我有一个变量工具快捷方式,它是由对象数组组成的对象: 我试图为对象中的每个元素(上面对象中的3个元素)返回一些HTML。因为我使用的是带有return语句的for循环,所以只显示每个数组的前几个元素(3个元素中的2个)。如何显示所有三个元素?