linux ftp命令主动模式,FTP主动模式和被动模式学习笔记

关于FTP,有被动模式和主动模式两种,有人说是验证模式,我不太认同,但懒得查资料,不想咬文嚼字,纠结这种事情。下面简单从自己理解的角度来记录一下两种模式的学习笔记。

1、被动模式

代码流程:

客户端:发PASV\r\n命令到21端口

服务器:通过21端口向客户端发数据通道端口(数据通道端口由服务器产生)

客户端:使用数据通道端口重新连接服务器,connect会创建新的socket,之后数据通道使用该socket

PASV客户端实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22latelee@localhost:~$ ftp 192.168.18.88

Connected to 192.168.18.88.

220 Serv-U FTP Server v6.0 for WinSock ready...

Name (192.168.18.88:latelee): latelee

331 User name okay, need password.

Password:

230 User logged in, proceed.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> passive // pasv模式

Passive mode on.

ftp> ls

227 Entering Passive Mode (192,168,18,88,25,172)

150 Opening ASCII mode data connection for /bin/ls.

drw-rw-rw- 1 user group 0 May 4 18:04 .

drw-rw-rw- 1 user group 0 May 4 18:04 ..

drw-rw-rw- 1 user group 0 May 4 18:22 test

226 Transfer complete.

ftp> LIST // 无此命令

?Invalid command

ftp> list // 无此命令

?Invalid command

服务器对应命令:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17Connected to 192.168.18.111 (Local address 192.168.18.88)

220 Serv-U FTP Server v6.0 for WinSock ready...

USER latelee

331 User name okay, need password.

PASS xxxxx

User LATELEE logged in

230 User logged in, proceed.

SYST

215 UNIX Type: L8

PASV

227 Entering Passive Mode (192,168,18,88,44,213)

LIST

150 Opening ASCII mode data connection for /bin/ls.

226 Transfer complete.

QUIT

221 Goodbye!

Closing connection for user LATELEE (00:00:15 connected)

二、主动模式

代码流程:

客户端:生成随机的大于1024的端口NUM,发PORT A,B,C,D,n,m\r\n命令到21端口(其中A,B,C,D为本机IP,n=NUM/256,m=NUM%256)

服务器:通过21端口向客户端发送是否成功的信息(成功:200 PORT Command successful.)

客户端:监听上面生成的NUM端口,如有连接,则Accept得到新的socket,数据通道即使用该socket。

注:资料2的文章说在监听NUM+1的端口,但我实际测试使用NUM可以,而监听NUM+1即不行,不知原因为何。另外,“PORT A,B,C,D,n,m\r\n”最后的回车换行和之前的字符是不能有空格的!因为写代码时是用sprintf组装字段的,习惯性多带个空格。正确的是示例如下:

1sprintf(buffer, "PORT %d,%d,%d,%d,%d,%d\r\n", ip1, ip2, ip3, ip4, port>>8, port&0xFF);

这个问题搞了差不多半个钟头才意识到。还有一个地方要注意,由于主动模式是客户端生成端口并监听,所以IP地址一定要是客户端的IP。在调试时,我复制代码不小心搞错本地IP,就发送不了数据到FTP服务器,后来才发现是IP传递错误。

实然想起上个月搞网络问题打印PHY寄存器,就是因为没有使能网络设备直接访问寄存器挂掉,当时是晚上7点,大多数人都回家吃饭了,心又急,脑子一时短路,来回验证超过半小时后才发现是这样原因。程序员对细节不能不注意。我相信有很多工程会因为将“==”误写为“=”或者因为某些括号等等问题导致debug花费大量时间。

主动模式客户端实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21latelee@localhost:~$ ftp 192.168.18.88

Connected to 192.168.18.88.

220 Serv-U FTP Server v6.0 for WinSock ready...

Name (192.168.18.88:latelee): latelee

331 User name okay, need password.

Password:

230 User logged in, proceed.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> ls

200 PORT Command successful.

150 Opening ASCII mode data connection for /bin/ls.

drw-rw-rw- 1 user group 0 May 4 18:04 .

drw-rw-rw- 1 user group 0 May 4 18:04 ..

drw-rw-rw- 1 user group 0 May 6 11:24 test

226 Transfer complete.

ftp> LIST

?Invalid command

ftp> list

?Invalid command

ftp>

服务器对应命令:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16Connected to 192.168.18.111 (Local address 192.168.18.88)

220 Serv-U FTP Server v6.0 for WinSock ready...

USER latelee

331 User name okay, need password.

PASS xxxxx

User LATELEE logged in

230 User logged in, proceed.

SYST

215 UNIX Type: L8

PORT 192,168,18,111,175,229

200 PORT Command successful.

LIST

150 Opening ASCII mode data connection for /bin/ls.

226 Transfer complete.

QUIT

221 Goodbye!

三、命令一览

下面命令是从网上一个开源工程头文件找到的,我觉得很简洁,记录于此。其中对应代码“\r\n”,表示有空格,其它没有出现说明是没有空格的。一般FTP命令由实际命令字符和回车换行组成,这两部分是没有空格的。但以前搞的时候,发现PASV命令与“\r\n”有无空格都能正常执行,不过为了不出意外,最好不带空格。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46FTP commands - Overview

simple commands

CDUP

QUIT

REIN

PASV

STOU

ABOR

PWD

SYST

NOOP

PORT

TYPE

CWD

MKD

SITE

HELP []

DELE

RMD

STRU

MODE

STAT []

ALLO

[ R ]

SMNT

commands for logon sequence

USER

PASS <> password

ACCT

commands for renaming

RNFR

RNTO

RETR

STOR

APPE

REST

LIST []

NLST []

non RFC-Commands

SIZE

MDTM

李迟 5.7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值