Опубликован: 06.08.2012 | Уровень: специалист | Доступ: платный
Лекция 24:

Basic network access: clients

ftp

ftp is the Internet File Transfer Program, and is the standard way to transfer large files long distances across the Net. It works for small files and short distances too, but you may find that scp or NFS are better alternatives in these areas.

One serious drawback in duplicating files across the net is that you need to have permission to access the remote system. Traditionally, you need a user ID to access a system. Of course, the file server could have a specific user ID without a password, but that would throw the system open to attack from crackers. ftp solves this problem by recognizing the special user ftp. This user name used to be anonymous, but it turned out to be a problem to spell. ftp servers still accept the name anonymous as well. Login is special: you don't need a password, but by convention, to help the system administrators with their bookkeeping, you should enter your real user ID in place of the password when logging in as ftp.A typical session might look like:

$ ftp ftp.freebsd.org
Connected to ftp.beastie.tdk.net.
cd 220 ftp.beastie.tdk.net FTP server (Version 6.00LS) ready.
331 Guest login ok, send ident as password.
Password:    password does not echo
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bin    to ensurebinary transfer
200 Type set to I.
230- The FreeBSD mirror at Tele Danmark Internet.
Moremessagesomitted Name (grog): ftp
331 Guest login ok, send your email address as password.
ftp> cd /pub/FreeBSD/ports/distfiles
250 CWD command successful.
ftp> get xtset-1.Ctar.gz
local: xtset-1.0.tar.gz remote: xtset-1.0.tar.gz
229 Entering Extended Passive Mode (|||58059|)
150 Opening BINARY mode data connection for 'xtset-1.0.tar.gz'   (4239 bytes).
100%  |*************************************|    4239    5.49 KB/s  00:00
226 Transfer complete.
4239 bytes received in 00:00 (5.49 KB/s)
ftp> ^D
221 Goodbye.

There are a number of things to note about this transfer:

  • The server may have multiple names, and the one you use may not be its canonical name (the name specified in the server's DNS A record—see page 363). By convention, the first part of the name of an ftp server is ftp. Here we connected to the server with the name ftp://ftp.FreeBSD.org, but the canonical name of the server is ftp://ftp.beastie.tdk.net.
  • Some versions of ftp transmit in ASCII mode by default: they change every incidence of the ASCII line feed character (the C language constant \n) to the sequence \r\n (they prep end an ASCII carriage return character). This permits you to print the results on normal printers, but makes a terrible mess of binary files. Transmitting in binary form always works. As the message shows, the FreeBSD ftp server uses binary mode, but it doesn't harm to enter the bin command. The message Type set to I. is ftp's way of telling you that it has set binary transmission mode.
  • The line of **** is an indication of the progress of the transfer. It's specific to BSD; other ftp clients don't show you anything here.

Specifying file names as URIs

This transmission is fairly typical, and it's the traditional way to do it. FreeBSD has another method, though, which can be of use: instead of the interactive approach, you can specify the file name as a URI, and you can use ftp to download HTTP documents from a web server. For example, the last transfer can be simplified to:

$ ftp ftp://ftp.freebsd.org/pub/FreeBSD/ports/distfiles/xtset-l.O.tar.gz
Connected to ftp.beastie.tdk.net.
220 ftp.beastie.tdk.net FTP server (Version 6.00LS) ready.
331 Guest login ok, send your email address as password.
...
230 Guest login ok, access restrictions apply.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Type set to I.
250 CWD command successful.
250 CWD command successful.
250 CWD command successful.
250 CWD command successful.
local: xtset-1.0.tar.gz remote: xtset-1.0.tar.gz
229 Entering Extended Passive Mode (|||59779|)
150 Opening BINARY mode data connection for 'xtset-1.0.tar.gz' (4239 bytes).
100%  |*************************************|  4239  5.82 KB/s  00:00
226 Transfer complete.
4239 bytes received in 00:00 (5.81 KB/s)
Goodbye.

Note that this method implies anonymous ftp: you don't have to log in. In the same way, you can download a web page like this:

$ ftp http://www.FreeBSD.org/index.litml
Requesting http://www.FreeBSD.org/index.html
100%  |*************************************| 26493  12.20 KB/s 00:02
26493 bytes retrieved in 00:02 (12.17 KB/s)

Note that in this case you can't just specify the URI as http://www.FreeBSD.org: you must specify the real file name.

Other ftp commands

ftp has about sixty commands, some of which can be of use. We'll look at the most useful commands in the following sections.

mget

ftp> ls
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
-rw-rw-r--  1  117  1001    43367  Nov   1  02:37  gcc-2.5.0-2.5.2.diff.gz
-rw-rw-r--  1  117  1001     1010  Nov   1  02:37  gcc-2.5.1-2.5.2.diff.gz
-rw-rw-r--  1  117  1001    78731  Nov  11  13:53  gcc-2.5.2-2.5.3.diff.gz
-rw-rw-r--  1  117  1001    13931  Nov  17  09:27  gcc-2.5.3-2.5.4.diff.gz
-rw-rw-r--  1  117  1001    76271  Nov  27  16:48  gcc-2.5.4-2.5.5.diff.gz
-rw-rw-r--  1  117  1001     8047  Dec   3  09:22  gcc-2.5.5-2.5.6.diff.gz
-rw-rw-r--  1  117  1001  5994481  Nov  27  16:49  gcc-2.5.5.tar.gz
-rw-rw-r--  1  117  1001    10753  Dec  12  19:15  gcc-2.5.6-2.5.7.diff.gz
-rw-rw-r--  1  117  1001    14726  Jan  24  09:02  gcc-2.5.7-2.5.8.diff.gz
-rw-rw-r--  1  117  1001  5955006  Dec  22  14:16  gcc-2.5.7.tar.gz
-rw-rw-r--  1  117  1001  5997896  Jan  24  09:03  gcc-2.5.8.tar.gz
226 Transfer  complete.          
ftp>

Frequently you need to copy more than a single file. For example, if you currently have gcc-2.5.0 and want to get gcc-2.5.8, you will discover the following files on the file server:

In other words, you have the choice of transferring 6 MB of software in gcc-2.5.8.tar.gz or seven incremental patch files with a total of less than 250 kB. On the other hand, copying the diffs requires typing all these long, complicated file names, so you might decide it's easier just to duplicate the whole 6 MB.

There is an easier way: mget (multiple get) duplicates files matching a wild card. You could perform the complete transfer with:

ftp> mget gcc-2*diff.gz
mget gcc-2.5.0-2.5.2.diff.gz?y
200 PORT command successful.
150 Opening BINARY mode data connection for
    gcc-2.5.0-2.5.2.diff.gz (43667 bytes).
226 Transfer complete.
43667 bytes received in 19 seconds (2.298 Kbytes/s)
mget gcc-2.5.1-2.5.2.diff.gz?n        we don't need this one
mget gcc-2.5.2-2.5.3.diff.gz?y
200 PORT command successful.
150 Opening BINARY mode data connection for
  gcc-2.5.2-2.5.3.diff.gz (78731 bytes).
226 Transfer complete.
78731 bytes received in 33 seconds (2.835 Kbytes/s)
... etc

prompt

Using mget saves a lot of network bandwidth and copies the files faster, but it has one disadvantage: ftp prompts you for each file name, so you have to wait around to answer the prompts. If you don't, ftp disconnects after 15 minutes of inactivity. It would be simpler to perform all the mgets without any intervention. This is where the prompt command comes in.

The prompt command specifies whether to issue certain prompts or not—the mget command is one example. This command is a toggle—in other words, if prompting is on, prompt turns it off, and if prompting is off, prompt turns it on. If prompting is off, the mget command in the previous example would have gone through with no interruptions.

In the previous example, you don't really want to transfer the file gcc-2.5.1-2.5.2.diff.gz, because you don't need it to perform the patches: you can upgrade from 2.5.0 to 2.5.2 directly with the file gcc-2.5.0-2.5.2.diff.gz. On the other hand, not copying the file would mean sitting around for the duration of the transfer and answering the prompt for each file, and the file is only 1 kB long. In this case, it is reasonable to copy it as well-in other cases; you may need to consider alternatives.

Бехзод Сайфуллаев
Бехзод Сайфуллаев
Узбекистан, Бухара, Бухарский институт высоких технологий, 2013
Василь Остапенко
Василь Остапенко
Россия