zoukankan      html  css  js  c++  java
  • 探测FTP状态,socket方式

    1、FTP返回码列表(哪里都能找到的):

    120 Service ready in NNN minutes.
    服务在NNN时间内可用
    -----------------------------------
    125 Data connection already open; transfer starting.
    数据连接已经打开,开始传送数据.
    -----------------------------------
    150 File status okay; about to open data connection.
    文件状态正确,正在打开数据连接.
    -----------------------------------
    200 Command okay.
    命令执行正常结束.
    -----------------------------------
    202 Command not implemented, superfluous at this site.
    命令未被执行,此站点不支持此命令.
    -----------------------------------
    211 System status, or system help reply.
    系统状态或系统帮助信息回应.
    -----------------------------------
    212 Directory status.
    目录状态信息.
    -----------------------------------
    213 File status. $XrkxmL=
    文件状态信息.
    -----------------------------------
    214 Help message.On how to use the server or the meaning of a particular non-standard command. This reply is useful only to the human user.
    帮助信息。关于如何使用本服务器或特殊的非标准命令。
    -----------------------------------
    215 NAME system type. Where NAME is an official system name from the list in the Assigned Numbers document.
    NAME系统类型。
    -----------------------------------
    220 Service ready for new user.
    新连接的用户的服务已就绪
    -----------------------------------
    221 Service closing control connection.
    控制连接关闭
    -----------------------------------
    225 Data connection open; no transfer in progress.
    数据连接已打开,没有进行中的数据传送
    -----------------------------------
    226 Closing data connection. Requested file action successful (for example, file transfer or file abort).
    正在关闭数据连接。请求文件动作成功结束(例如,文件传送或终止)
    -----------------------------------
    227 Entering Passive Mode (h1,h2,h3,h4,p1,p2).
    进入被动模式
    -----------------------------------
    230 User logged in, proceed. Logged out if appropriate.
    用户已登入。 如果不需要可以登出。
    -----------------------------------
    250 Requested file action okay, completed.
    被请求文件操作成功完成 63
    -----------------------------------
    257 "PATHNAME" created.
    路径已建立
    -----------------------------------
    331 User name okay, need password.
    用户名存在,需要输入密码
    -----------------------------------
    332 Need account for login.
    需要登陆的账户
    -----------------------------------
    350 Requested file action pending further inFORMation U
    对被请求文件的操作需要进一步更多的信息
    -----------------------------------
    421 Service not available, closing control connection.This may be a reply to any command if the service knows it must shut down.
    服务不可用,控制连接关闭。这可能是对任何命令的回应,如果服务认为它必须关闭
    -----------------------------------
    425 Can't open data connection.
    打开数据连接失败
    -----------------------------------
    426 Connection closed; transfer aborted.
    连接关闭,传送中止。
    -----------------------------------
    450 Requested file action not taken.
    对被请求文件的操作未被执行
    -----------------------------------
    451 Requested action aborted. Local error in processing.
    请求的操作中止。处理中发生本地错误。
    -----------------------------------
    452 Requested action not taken. Insufficient storage space in system.File unavailable (e.g., file busy).
    请求的操作没有被执行。系统存储空间不足。 文件不可用
    -----------------------------------
    500 Syntax error, command unrecognized. This may include errors such as command line too long.
    语法错误,不可识别的命令。 这可能是命令行过长。
    -----------------------------------
    501 Syntax error in parameters or arguments.
    参数错误导致的语法错误
    -----------------------------------
    502 Command not implemented.
    命令未被执行
    -----------------------------------
    503 Bad sequence of commands.
    命令的次序错误。
    -----------------------------------
    504 Command not implemented for that parameter.
    由于参数错误,命令未被执行
    -----------------------------------
    530 Not logged in.
    没有登录
    -----------------------------------
    532 Need account for storing files.
    存储文件需要账户信息!
    -----------------------------------
    550 Requested action not taken. File unavailable (e.g., file not found, no access).
    请求操作未被执行,文件不可用。
    -----------------------------------
    551 Requested action aborted. Page type unknown.
    请求操作中止,页面类型未知
    -----------------------------------
    552 Requested file action aborted. Exceeded storage allocation (for current directory or dataset).
    对请求文件的操作中止。 超出存储分配
    -----------------------------------
    553 Requested action not taken. File name not allowed
    请求操作未被执行。 文件名不允许
     
    2、状态探测过程

             HITE_LOGGER::instance().logDebug("开始探测FTP状态");
                if(client.connectTo("127.0.0.1", 21, sc))
                {
                    client.recvFrom(szbuf,128);

                    std::string lsr = szhite_gvp::__Format("USER root PASS 123456 ");
                    int ret = client.sendTo(lsr.c_str(), lsr.length());
                    client.recvFrom(szbuf,128);
                    lsr = szbuf;

                    if(lsr.find("230") != std::string::npos)
                    {
                        CurState.StatusType = 7;
                    }
                    else
                    {
                        client.recvFrom(szbuf,128);
                        lsr = szbuf;
                        if(lsr.find("230") != std::string::npos)
                        {
                            CurState.StatusType = 7;
                        }
                        else
                        {
                            CurState.StatusType = 6;
                        }
                    }
                    client.close();
                }
                else
                {
                    std::cout << "port 21 is disable"<<std::endl;
                    CurState.StatusType = 6;
                }
               Sleep(5000);
      
        这里是使用的自己封装的TCP类,client作为客户端,初始化步骤正常操作,连接的时候连接目标FTP的IP及对应端口
        第一次连接完服务端一般会返回一些东西,微软的IIS6.0-FTP上返回为“220 Microsoft FTP Service”,ServU返回为“220 Serv-U FTP Server v6.3 for WinSock ready...”,其他服务端没有测试,反正一般根据返回字符串里面的220代码来判断连接是否正常

      然后发送自己的账号密码,上面测试代码里面用的是root/123456的用户及密码,此处返回值为

    “331 User name okay, need password.
    230 User logged in, proceed.”

    可以在字符串里面找到230作为验证账号登陆是否成功,失败则服务端返回

    “331 User name okay, need password.
    530 Not logged in.”

    根据530来判断账号登录失败。

        实际测试发现,这两条服务端返回有时是一次发过来,有时会分两次发过来,所以在第一次找230失败的时候再接收一次,以防止服务端第二次才发送FTP登录状态。也可以按顺序先发账号,再发密码。

    3、总结

      这种方式是通过socket通信向服务端发送基本的FTP操作指令,做一些简单的状态探测比较方便,但是复杂的操作还是用别的方式效率更佳。

  • 相关阅读:
    转 du: 查看目录大小
    conductor v3 docker-compose 运行
    使用parquetjs 创建parquet 文件
    dremio 数据格式的一些说明
    集成minio sidekick & console 的测试
    hermes golang email 模版包
    gothic 类似gotrue 的服务
    cube.js 官方关于cube store 的一些实践说明
    dremio sql server 链接问题
    使用sbt-native-packager 构建通用的scala 软件包
  • 原文地址:https://www.cnblogs.com/TTaiAL/p/4434063.html
Copyright © 2011-2022 走看看