LX-SVS-INFO-ftpclient
Updated sep/16/10 7:22

FTP client

FTP is een protocol: File Transfer Protocol. Het bestaat al sedert 1971 (RFC114) en in zijn huidige vorm sedert 1985 (RFC959). File transfert is dan ook één van de belangrijkste activiteiten op netwerken. Printen over het netwerk, doe je door een file naar de printer te sturen, bittorrent is een vorm van file transfert, file sharing is een meer intelligente vorm. Maar de basisnoodzaak is in die 40 jaar nooit veranderd: "We willen file A op computer 1 ook op computer 2, en kan dat asjeblief via het netwerk"

Er bestaan heel veel grafische ftp clients. Firefox, Konqueror, FileZilla, gFTP, WS-ftp, ... om er maar een paar te noemen. Ondanks de middelbare leeftijd van dit protocol, is het nog altijd razend populair.

Er bestaan ook talloze ftp clients voor de shell. Midnight Commander, TNftp, lftp en wget om er maar een paar te noemen. In dit hoofdstuk focussen we echter op de standaard ftp client zoals die in 4.2BSD unix zijn intrede deed. Deze ftp client komt standaard voor bij alle linux, bsd en unix versies, Mac en Windows. Wie de moeite doet om deze ftp client onder de knie te krijgen wordt hiervoor beloond met een universele tool die wereldwijd vanop elke netwerkcomputer beschikbaar is.

In mijn voorbeelden maak ik gebruik van het pakket ftp versie 0.17-19build1

Meer weten: http://en.wikipedia.org/wiki/Ftp
  1. ftp gebruiken als anonymous user

    Veruit het meeste ftp verkeer gebeurt als anonymous user, om files te downloaden van een publieke server. Zo een publieke server is ftp.belnet.be. Je kan hem bereiken via http, rsync en ftp.
    1. ftp starten en inloggen

      We voeren de volgende commando's aan de shell prompt uit. Wat we moeten intikken is vetjes weergegeven, wat de server antwoordt, staat schuin.

      Tik hetvolgende in:

      $ ftp ftp.belnet.be
      Connected to hydra.belnet.be.
      220-Welcome to the BELNET public FTP cluster server ftp.belnet.be !
       
      This archive is provided through a cluster of 12 double dual cores Intel Xeon 3 GHz processors machines, each having 4 GB of RAM. The 16 TB FTP archives is taken from an iSCSI SATA SAN.
      This cluster is located in Brussels, Belgium and operated by BELNET, the belgian Education and Research Network. If you have any problem, question or mirror request, please send them to ftpmaint@belnet.be
      This archive is also available through the following means:
       RSYNC rsync.belnet.be (IPv4)
       HTTP http://ftp.belnet.be (IPv4 + IPv6)
       FTP ftp://ftp.belnet.be (IPv4 + IPv6)
      Note: opening too many parallel connections to this host is considered an abuse.
      Currently used storage capacity : 15T

      220 ProFTPD 1.3.2 Server (BELNET FTPD Server) [193.190.67.15]

      Name (ftp.belnet.be:jan): anonymous
      331 Anonymous login ok, send your complete email address as your password
      Password:
      whateveryouwant
      230 Anonymous access granted, restrictions apply
      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp>
      quit
      221 Goodbye.
      $


      De server wacht nu op een reactie van ons met de ftp> prompt.

      We tikken geen url in zoals bij firefox of bij wget maar gewoon het commando ftp gevolgd door de servernaam of zijn ip-adres.

      De server geeft dan een heleboel informatie over zichzelf, en over wat er mag gebeuren door wie.

      Dan vraagt hij om een usernaam. In ons geval loggen we in als anonymous.
      Welk paswoord dat we daarna intikken heeft bij ftp.belnet.be geen enkel belang. Bij sommige ftp-servers wordt een email-adres gevraagd als paswoord, maar om spam te vermijden tik je dan best iets in van de vorm napoleon@france.fr

      Om ftp te verlaten tikken we quit.

      Een ftp server is altijd beleefd en geeft een leesbaar antwoordt na elke <ENTER> van jouw kant. Voor jouw client software geeft de server ook nog een drie cijferige code mee. Die hebben we in het hogere voorbeeld onderlijnd weergegeven.

      Meer over deze codes vind je hier:
      http://en.wikipedia.org/wiki/List_of_FTP_server_return_codes


      Soms gebeurt het dat we een tikfout maken bij de servernaam. Bekijk even het volgende voorbeeld:

      $ ftp ft.belnet.be
      ftp: ft.belnet.be: Unknown host
      ftp>
      open ftp.belnet.be
      Connected to hydra.belnet.be.
      220-Welcome to the BELNET public FTP cluster server ftp.belnet.be !

      ...
      ftp> close
      221 Goodbye.
      ftp>

      Na de melding unknown host, blijft de ftp prompt wachten op je commando's. In plaats van quit in te tikken en van vooraf aan te herbeginnen kunnen we de verbinding openen met het open commando. Indien we een sessie afsluiten met close, blijft de ftp prompt staan.
    2. wat nu: ?

      Welke commando's je in ftp allemaal ter beschikking hebt zie je als je het vraagteken "?" intikt aan de ftp prompt:

      $ ftp
      ftp> ?
      Commands may be abbreviated.  Commands are:

      !        debug      mdir        qc        send
      $        dir        mget        sendport  site
      account  disconnect mkdir       put       size
      append   exit       mls         pwd       status
      ascii    form       mode        quit      struct
      bell     get        modtime     quote     system
      binary   glob       mput        recv      sunique
      bye      hash       newer       reget     tenex
      case     help       nmap        rstatus   tick
      cd       idle       nlist       rhelp     trace
      cdup     image      ntrans      rename    type
      chmod    lcd        open        reset     user
      close    ls         prompt      restart   umask
      cr       macdef     passive     rmdir     verbose
      delete   mdelete    proxy       runique   ?

      ftp>

      Indien je meer informatie wenst over één specifiek ftp-commando, kun je hulp opvragen als volgt:

      ftp> ? close
      close         terminate ftp session
      ftp> ? quit
      quit          terminate ftp session and exit
      ftp> ? exit
      exit          terminate ftp session and exit
      ftp> ? bye
      bye           terminate ftp session and exit

      In de man pagina's staat er echter meer uitleg:

      $ man ftp
      FTP(1)                             BSD General Commands Manual                             FTP(1)
      NAME
           ftp — Internet file transfer program
      SYNOPSIS
           ftp [-pinegvd] [host [port]]
           pftp [-inegvd] [host [port]]
      DESCRIPTION
      Ftp is the user interface to the Internet standard File Transfer Protocol. The program allows a user to transfer files to and from a remote network site.

      Options may be specified at the command line, or to the command interpreter.

      ...
      close    Terminate the FTP session with the remote server, and return
               to the command
      interpreter.  Any defined macros are erased.

      bye      Terminate the FTP session with the remote server and exit
               ftp.  An end of file
      will also terminate the session and exit.
    3. ls / dir / cd

      Het leren werken met de ftp prompt is gelukkig niet zo moeilijk. De commando's zijn unix achtig. De root directory is gewoon / en de directories zijn van mekaar gescheiden door diezelfde forward slash "/"

      Eén van de eerste dingen die we willen doen op een onbekende server, is kijken wat er allemaal op zo'n server staat. Dat doen we met het commando ls. Naar een andere directory hoppen doen we met cd. dir doet hetzelfde als ls. Met pwd vinden we terug waar we ons op dat ogenblik in de directoryhiërarchie van de server bevinden.

      ftp> open ftp.belnet.be
      Connected to hydra.belnet.be.
      220-Welcome to the BELNET public FTP cluster server ftp.belnet.be !
      220 ProFTPD 1.3.2 Server (BELNET FTPD Server) [193.190.67.15]
      Name (ftp.belnet.be:jan): anonymous
      331 Anonymous login ok, send your complete email address as your password
      Password: ********
      230 Anonymous access granted, restrictions apply

      Remote system type is UNIX.
      Using binary mode to transfer files.

      ftp> ls

      200 PORT command successful
      150 Opening ASCII mode data connection for file list
      lrw-r--r--   1 ftp      ftp            28 Jun 17  2009 debian -> mirror/ftp.debian.org/debian
      -rw-r--r--   1 ftp      ftp             0 Mar  4  2010 keepalive.txt
      drwxr-xr-x  96 ftp      ftp          4096 May 21 18:30 mirror
      lrw-r--r--   1 ftp      ftp             6 Jun 17  2009 mirrors -> mirror
      drwxr-xr-x   2 ftp      ftp          4096 May 10 08:35 packages
      lrw-r--r--   1 ftp      ftp             1 Jun 17  2009 pub -> .
      226 Transfer complete

      ftp>
      dir

      200 PORT command successful
      150 Opening ASCII mode data connection for file list
      lrw-r--r--   1 ftp      ftp            28 Jun 17  2009 debian -> mirror/ftp.debian.org/debian
      -rw-r--r--   1 ftp      ftp             0 Mar  4  2010 keepalive.txt
      drwxr-xr-x  96 ftp      ftp          4096 May 21 18:30 mirror
      lrw-r--r--   1 ftp      ftp             6 Jun 17  2009 mirrors -> mirror
      drwxr-xr-x   2 ftp      ftp          4096 May 10 08:35 packages
      lrw-r--r--   1 ftp      ftp             1 Jun 17  2009 pub -> .
      226 Transfer complete

      ftp> cd mirror
      250 CWD command successful

      ftp> ls
      200 PORT command successful
      150 Opening ASCII mode data connection for file list
      drwxr-xr-x   2 ftp      ftp          4096 Jun 17  2009 BELNET-honeypot
      drwxr-xr-x   8 ftp      ftp          4096 Sep 15 10:00 FOSDEM
      -rw-r--r--   1 ftp      ftp           853 Sep 15 20:00 HEADER.html
      drwxr-xr-x   2 ftp      ftp          4096 Jun 17  2009 Mandrakelinux
      drwxr-xr-x   5 ftp      ftp          4096 Sep 15 01:00 PortablePython
      drwxr-xr-x   5 ftp      ftp          4096 May 16  2006 apt.bxlug.be
      drwxr-xr-x  11 ftp      ftp        507904 Apr  4 13:27 archlinux.org
      drwxr-xr-x   8 ftp      ftp          4096 May  1 13:43 backports.org
      drwxr-xr-x   2 ftp      ftp          4096 Mar  4  2010 backtrack
      drwxr-xr-x   4 ftp      ftp          4096 May  8 06:07 baron.haiku-os.org
      drwxr-xr-x   3 ftp      ftp          4096 Jun 17  2009 blastwave.org
      drwxr-xr-x   3 ftp      ftp          4096 Jun 17  2009 cdimage.ubuntu.com
      ...
      drwxr-xr-x  23 ftp      ftp          4096 Sep 14 04:05 www.tldp.org
      drwxr-xr-x   4 ftp      ftp          4096 Jun 23  2009 xorp.org
      drwxr-xr-x   4 ftp      ftp          4096 Apr  7 14:33 yoper.com
      226 Transfer complete

      ftp> cd ..
      250 CWD command successful

      ftp> pwd
      257 "/" is the current directory

      ftp> quit
      221 Goodbye.

    4. passive or not passive

      Soms lukt de verbinding met een ftp-server wel, maar zodra we het commando ls intikken gaat er wat fout. De machine van waarop we de volgende ftp sessie draaien staat achter een firewall.

      jan@gogo1:~$ ftp ftp.belnet.be
      Connected to hydra.belnet.be.
      220-Welcome to the BELNET public FTP cluster server ftp.belnet.be !
      220 ProFTPD 1.3.2 Server (BELNET FTPD Server) [193.190.67.15]

      Name (ftp.belnet.be:jan): anonymous
      331 Anonymous login ok, send your complete email address as your password
      Password: <ENTER>
      230 Anonymous access granted, restrictions apply
      Remote system type is UNIX.
      Using binary mode to transfer files.

      ftp> ls
      200 PORT command successful

      Na "200 PORT command successful" gebeurt er niets meer. We wachten ongeveer een minuut en drukken dan ongeduldig <CTRL><C>. 
      ^C
      421 Service not available, remote server has closed connection
      receive aborted
      waiting for remote to finish abort



      Het probleem vindt zijn oorzaak in het ftp protocol zelf: bij het downloaden (en met ls wordt de catalog van een directory gedownload) is het de server die het initiatief neemt om een sessie open te zetten naar de client, en NAT-routers houden dit standaard tegen.

      Met het commando passive, draaien we de synchronisatie om: de server biedt een socket aan om op te verbinden, en de client initialiseert de verbinding:

      ftp> open ftp.belnet.be

      Connected to hydra.belnet.be.
      220-Welcome to the BELNET public FTP cluster server ftp.belnet.be !
      220 ProFTPD 1.3.2 Server (BELNET FTPD Server) [193.190.67.15]

      Name (ftp.belnet.be:jan): anonymous
      331 Anonymous login ok, send your complete email address as your password
      Password: <enter>
      230 Anonymous access granted, restrictions apply
      Remote system type is UNIX.
      Using binary mode to transfer files.

      ftp> passive
      Passive mode on.
      ftp> ls
      227 Entering Passive Mode (193,190,67,15,201,218).
      150 Opening ASCII mode data connection for file list
      lrw-r--r--   1 ftp      ftp            28 Jun 17  2009 debian -> mirror/ftp.debian.org/debian
      -rw-r--r--   1 ftp      ftp             0 Mar  4  2010 keepalive.txt
      drwxr-xr-x  96 ftp      ftp          4096 May 21 18:30 mirror
      lrw-r--r--   1 ftp      ftp             6 Jun 17  2009 mirrors -> mirror
      drwxr-xr-x   2 ftp      ftp          4096 May 10 08:35 packages
      lrw-r--r--   1 ftp      ftp             1 Jun 17  2009 pub -> .
      226 Transfer complete

      ftp>
    5. downloaden met get en mget

      Het doel van anonymous ftp is meestal een download. Dat doen we met het commando get.

      ftp> pwd
      257 "/mirror/ftp.debian.org/debian/pool/contrib/g/googleearth-package" is the current directory
      ftp> ls
      200 PORT command successful
      150 Opening ASCII mode data connection for file list
      -rw-r--r--   1 ftp      ftp           835 Apr 18  2008 googleearth-package_0.5.4.dsc
      -rw-r--r--   1 ftp      ftp         19720 Apr 18  2008 googleearth-package_0.5.4.tar.gz
      -rw-r--r--   1 ftp      ftp          9428 Apr 18  2008 googleearth-package_0.5.4_all.deb
      -rw-r--r--   1 ftp      ftp           943 Dec  8  2009 googleearth-package_0.5.7.dsc
      -rw-r--r--   1 ftp      ftp         21418 Dec  8  2009 googleearth-package_0.5.7.tar.gz
      -rw-r--r--   1 ftp      ftp         10696 Dec  8  2009 googleearth-package_0.5.7_all.deb

      226 Transfer complete
      ftp> get googleearth-package_0.5.7_all.deb
      local: googleearth-package_0.5.7_all.deb remote: googleearth-package_0.5.7_all.deb
      200 PORT command successful
      150 Opening BINARY mode data connection for googleearth-package_0.5.7_all.deb (10696 bytes)
      226 Transfer complete
      10696 bytes received in 0.24 secs (43.5 kB/s)


      Dat werkt goed, maar get houdt niet van wildcards. Indien we meerdere files willen downloaden met gebruik van wildcards, gebruiken we mget.

      ftp> get *
      local: 01_123.jpg remote: *
      200 PORT command successful
      550 *: No such file or directory

      ftp> mget *
      mget googleearth-package_0.5.4.dsc? y
      200 PORT command successful
      150 Opening BINARY mode data connection for googleearth-package_0.5.4.dsc (835 bytes)
      226 Transfer complete
      835 bytes received in 0.02 secs (36.3 kB/s)
      mget googleearth-package_0.5.4.tar.gz? y
      200 PORT command successful
      150 Opening BINARY mode data connection for googleearth-package_0.5.4.tar.gz (19720 bytes)
      226 Transfer complete
      19720 bytes received in 0.38 secs (50.6 kB/s)

      ...

      Het vervelende van mget is dat het telkens om bevestiging vraagt. Na het commando prompt off vraagt mget dat niet meer:

      ftp> prompt off

      Interactive mode off.
      ftp> mget *
      local: googleearth-package_0.5.4.dsc remote: googleearth-package_0.5.4.dsc
      200 PORT command successful
      150 Opening BINARY mode data connection for googleearth-package_0.5.4.dsc (835 bytes)
      226 Transfer complete
      835 bytes received in 0.01 secs (116.7 kB/s)
      local: googleearth-package_0.5.4.tar.gz remote: googleearth-package_0.5.4.tar.gz
      200 PORT command successful
      150 Opening BINARY mode data connection for googleearth-package_0.5.4.tar.gz (19720 bytes)
      226 Transfer complete
      19720 bytes received in 0.10 secs (185.4 kB/s)

      ...
      ftp>
    6. ascii en binary

      Als we wat downloaden met get of mget gaat ftp er meestal van uit dat het om 'binary' files gaat. Indien we echter tekstfiles willen downloaden, komt het EOF karakter in binary mode niet altijd goed mee. Om hieraan te verhelpen kunnen we de download mode switchen tussen binary en ascii. Met het commando type brengen we de download mode op scherm.

      Kijk even naar het volgende voorbeeld:
      ...
      230 Anonymous access granted, restrictions apply

      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp>
      ascii
      200 Type set to A
      ftp> type
      Using ascii mode to transfer files.
      ftp>
      binary
      200 Type set to I
      ftp> type
      Using binary mode to transfer files.

      ftp>

    7. wget als alternatief

      Met de utility wget lukt een ftp download dikwijls beter dan met ftp zelf. Bij een onverwacht verbreken van de verbinding, herstelt wget deze eigenhandig, en downloadt hij verder vanaf het punt waar hij reeds gekomen was. wget is een één-regel-commando dat zich via echo makkelijk laat 'pipen' naar at. Op die manier kunnen we een download schedulen.

      $ wget ftp://ftp.debian.org/debian/pool/contrib/g/googleearth-package/*
      --2010-09-16 00:13:06--  ftp://ftp.debian.org/debian/pool/contrib/g/googleearth-package/*
                 => `.listing'
      Resolving ftp.debian.org... 130.89.149.226, 2001:610:1908:a000::149:226
      Connecting to ftp.debian.org|130.89.149.226|:21... connected.
      Logging in as anonymous ... Logged in!
      ==> SYST ... done.    ==> PWD ... done.
      ==> TYPE I ... done.  ==> CWD (1) /debian/pool/contrib/g/googleearth-package ... done.
      ==> PASV ... done.    ==> LIST ... done.

          [ <=>                                                       ] 655         --.-K/s   in 0s      

      2010-09-16 00:13:06 (90.7 MB/s) - `.listing' saved [655]

      Removed `.listing'.
      --2010-09-16 00:13:06--  ftp://ftp.debian.org/debian/pool/contrib/g/googleearth-package/googleearth-package_0.5.4.dsc
                 => `googleearth-package_0.5.4.dsc'
      ==> CWD not required.
      ==> PASV ... done.    ==> RETR googleearth-package_0.5.4.dsc ... done.
      Length: 835

      100%[==========================================================>] 835         --.-K/s   in 0.008s  

      ...


      $ echo "wget ftp://ftp.belnet.be/mirror/linuxmint/linuxmint-debian-201009-gnome-dvd-i386.iso" | at now +100 minutes
      warning: commands will be executed using /bin/sh
      job 4 at Thu Sep 16 01:57:00 2010


  2. ftp gebruiken op je webserver of je eigen multi-purpose ftp-server

    Naast het gebruik als downloadmotor van alles en nog wat als anonymous user, wordt ftp ook bijna overal ingezet als updatemotor van websites. Je krijgt dan een account (username en paswoord) waarmee je kan inloggen. In je eigen root-directory heb je dan upload, create en delete rechten, en bijgevolg meer commando's. Je kan natuurlijk ook een gewone ftp account hebben, ergens, in je organisatie, ... of je draait zelf een server.

    Bij het uploaden gebeurt het veel vaker, dat je de lokale directorystructuur wenst te doorbladeren. Daarvoor zijn er enkele commando's beschikbaar. Die gaan we even testen.

    Tot slot bekijken we ook enkele manieren om ftp te gebruiken vanuit een script, om zo sneller updates te kunnen uitvoeren.

    1. inloggen

      Inloggen is hetzelfde voor elke user, ook anonymous. Al is het natuurlijk wel belangrijk dat je een veilig paswoord gebruikt bij je persoonlijke account.

      Als je inlogt als anonymous kom je dikwijls in een directory /pub terecht. Gewone gebruikers komen eerder in een chrooted /home/<username> soort van directory terecht (al kun je daarvan het path niet zomaar zien). De chroot zorgt ervoor dat andere gebruikers jouw directory niet kunnen zien, en jij de directories van een ander niet.

      Een voorbeeld:

      $ ftp ftp.lx800.be
      Connected to ftp.lx800.be.
      220 "Stand and deliver, login or be assimilated ..."
      Name (ftp.lx800.be:piet):
      jan
      331 Please specify the password.
      Password: <
      password>
      230 Login successful.
      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp>
      ls
      200 PORT command successful. Consider using PASV.
      150 Here comes the directory listing.
      drwxr-xr-x    2 1004     100            80 Sep 16 16:31 Documents
      drwxr-xr-x    2 1004     100            48 Sep 16 16:31 bin
      drwxr-xr-x    2 1004     100            80 Sep 16 16:31 public_html
      226 Directory send OK.
      ftp>
      ls public_html
      200 PORT command successful. Consider using PASV.
      150 Here comes the directory listing.
      226 Directory send OK.
      ftp>
      quit
      221 Goodbye.


      Nu gebeurt het wel eens dat we een tikfout maken in ons paswoord, of zelfs in onze gebruikersnaam. ftp verlaten is dan niet nodig. Met het commando user proberen we gewoon opnieuw:

      ...
      Name (ftp.lx800.be:piet): jan
      331 Please specify the password.
      Password: <
      verkeerd>
      530 Login incorrect.
      Login failed.
      ftp>
      user jan
      331 Please specify the password.
      Password: <
      password>
      230 Login successful.
      Remote system type is UNIX.
      Using binary mode to transfer files.
      ftp>

      ...

    2. cd en lcd

      Het commando cd wordt uitgevoerd op de ftp server. Maar als we files willen uploaden, moeten we soms ook lokaal van directory wisselen. Dat doen we met lcd. Een voorbeeld:

      ftp>
      lcd
      Local directory now /home/www/linux800
      ftp>
      lcd ..
      Local directory now /home/www
      ftp>
      lcd
      Local directory now /home/www
      ftp>
      cd public_html
      250 Directory successfully changed.
      ftp>
      pwd
      257 "/public_html"
      ftp>


      Het voorbeeld verduidelijkt de werking. lcd ingetikt zonder argument, brengt de lokale directory op scherm. Dit is verglijkbaar met het commando pwd op de server. Omdat we aan de commandprompt niet kunnen zien waar we ons lokaal noch remote bevinden, zullen we regelmatig pwd en lcd moeten intikken.
    3. !

      Aan de ftp prompt heeft het uitroepteken een speciale betekenis. Het gaat commando's vooraf die uitgevoerd worden in de lokale shell. We kunnen dus met !ls zien wat er op onze lokale directory te vinden is. Met !vim <filenaam> kunnen we nog snel een file editeren, we kunnen een pas afgehaald bestand met !mv op een andere plaats zetten, enz.

      ftp>
      ls
      200 PORT command successful. Consider using PASV.
      150 Here comes the directory listing.
      drwxr-xr-x    2 1004     100            80 Sep 16 16:31 Documents
      drwxr-xr-x    2 1004     100            48 Sep 16 16:31 bin
      drwxr-xr-x    2 1004     100            80 Sep 16 16:31 public_html
      226 Directory send OK.
      ftp>
      cd public_html
      250 Directory successfully changed.
      ftp>
      lcd
      Local directory now /home/www/linux800
      ftp>
      !ls *ftp*
      lx-svs-info-ftpclient.html           
      lx-svs-info-vsftpd.php    
      lx-svs-prak-vsftpd.html
                             
      lx-svs-info-ftpclient.php
      lx-svs-info-vsftpd-virtualhosts.html 
      lx-svs-prak-vsftpd.php

      lx-svs-info-vsftpd.html    
      lx-svs-info-vsftpd-virtualhosts.php

      ftp>
      mput lx-svs-info-*virt*
      mput lx-svs-info-apache2-virtualhosts.html?
      n
      mput lx-svs-info-apache2-virtualhosts.php?
      n
      mput lx-svs-info-vsftpd-virtualhosts.html?
      y
      200 PORT command successful. Consider using PASV.
      150 Ok to send data.
      226 File receive OK.
      4175 bytes sent in 0.01 secs (752.9 kB/s)
      mput lx-svs-info-vsftpd-virtualhosts.php?
      y
      200 PORT command successful. Consider using PASV.
      150 Ok to send data.
      226 File receive OK.
      521 bytes sent in 0.00 secs (2469.8 kB/s)
      ftp>
      quit
      221 Goodbye.

    4. zeven commando's

      put, mput, delete, mdelete, mkdir, rmdir, chmod zijn zeven commando's die je nodig hebt om structuren aan te maken, te beheren en te verwijderen op je server. Het gebruik van deze commando's ligt voor de hand. Voor mput verwijs ik naar het voorbeeld in de vorige paragraaf.
      Voor de zes andere commando's nog een kort voorbeeld:

      ftp> cd public_html
      250 Directory successfully changed.
      ftp>
      lcd
      Local directory now /home/www/linux800
      ftp>
      ls
      200 PORT command successful. Consider using PASV.
      150 Here comes the directory listing.
      -rw-r--r--  1 1004  100 4175 Sep 16 17:33 lx-svs-info-vsftpd-virtualhosts.html
      -rw-------  1 1004  100  521 Sep 16 17:33 lx-svs-info-vsftpd-virtualhosts.php

      226 Directory send OK.
      ftp>
      chmod 644 lx-svs-info-vsftpd-virtualhosts.php
      200 SITE CHMOD command ok.
      ftp>
      put index.php
      local: index.php remote: index.php
      200 PORT command successful. Consider using PASV.
      150 Ok to send data.
      226 File receive OK.
      495 bytes sent in 0.01 secs (84.6 kB/s)
      ftp>
      chmod 644 index.php
      200 SITE CHMOD command ok.
      ftp>
      mkdir test
      257 "/public_html/test" created
      ftp>
      mkdir jpgs
      257 "/public_html/jpgs" created
      ftp>
      rmdir test
      250 Remove directory operation successful.
      ftp> mdelete *virtual*
      mdelete lx-svs-info-vsftpd-virtualhosts.html? y
      250 Delete operation successful.
      mdelete lx-svs-info-vsftpd-virtualhosts.php? y
      250 Delete operation successful.
      ftp>
      delete index.php
      250 Delete operation successful.

    5. not interactive mode met switches / wput

      Wie veel ftp uploads doet, wordt het tikken van servernaam, usernaam, paswoord en directory al snel beu. Kunnen we ftp opnemen in een script?

      Dat kan, maar wees zeer voorzichtig met het opnemen van je paswoord in zo'n script. Zorg dat alleen jij leesrechten hebt op je script. Zorg dat het zich in een directory bevindt waar alleen jijzelf leesrechten hebt.

          #!/bin/bash
          HOST='ftp.lx800.be'
          USER='jan'
          PASSWD='sdf12345'
          FILE=$1
          ftp -n $HOST <<END_SCRIPT
          quote USER $USER
          quote PASS $PASSWD
          cd httpdocs
          put $FILE
          quit
          END_SCRIPT

      wput is een ander paar mouwen. Hoewel het gebruik van wput veel makkelijker is dan het script van hierboven, is het nog onveiliger.

      gebruik:

      $ wput filenaam ftp://user:password@ftp.example.com/httpdocs/

      voorbeeld:

      $ wput -uv lx-svs-info-vsftpd.php \
      > ftp://jan:sdf12345@ftp.lx800.be/httpdocs/

      --21:43:45-- `lx-svs-info-vsftpd.php'
          => ftp://ftp.lx800_be:xxxxx@97.13.196.2:21/httpdocs/lx-svs-info-vsftpd.php
      Connecting to 97.13.196.2:21... connected!
      ==> AUTH TLS ... failed (AUTH not understood).
      Logging in as jan ... Logged in!
      ==> CWD httpdocs
      ==> TYPE I ... done.
      ==> SIZE lx-svs-info-vsftpd.php ... done (508 bytes)
      Remote file size is equal to local size. Restarting at 0
      ==> PASV ... done.
      ==> STOR lx-svs-info-vsftpd.php ... done.
      Length: 508
      21:43:45 (lx-svs-info-vsftpd.php) - `10.38K/s' [508]
      FINISHED --21:43:45--
      Transfered 508 bytes in 1 file at  2.23K/s


      Wat er nu precies zo onveilig is aan dit script: je paswoord komt terecht in .bash_history en iemand die ps -aux intikt op dezelfde computer terwijl wput loopt ziet jouw hele commando, inclusief je paswoord.

      Gebruik wput dan ook alleen op je eigen single user pc.

      Meer info over wput:
      http://www.debuntu.org/2006/04/07/21-wget-wput-or-how-to-easily-download-upload-over-internet

  3. appendix:

    1. ftp onder microsoft

      http://www.nsftools.com/tips/MSFTP.htm

    2. alle ftp commando's

      De in deze tekst behandelde commando's staan vetjes:


      !             escape to the shell
      ?             print local help information

      $             execute macro
      account       send account command to remote server
      append        append to a file
      ascii         set ascii transfer type
      bell          beep when command completed
      binary        set binary transfer type
      bye           terminate ftp session and exit
      case          toggle mget upper/lower case id mapping
      cd            change remote working directory
      cdup          change remote working directory to parent directory
      chmod         change file permissions of remote file
      close         terminate ftp session
      cr            toggle carriage return stripping on ascii gets
      debug         toggle/set debugging mode
      delete        delete remote file
      dir           list contents of remote directory
      disconnect    terminate ftp session
      exit          terminate ftp session and exit
      form          set file transfer format
      get           receive file
      glob          toggle metacharacter expansion of local file names
      hash          toggle printing `#' for each buffer transferred
      help          print local help information
      idle          get (set) idle timer on remote side
      image         set binary transfer type
      lcd           change local working directory
      ls            list contents of remote directory
      macdef        define a macro
      mdelete       delete multiple files
      mdir          list contents of multiple remote directories
      mget          get multiple files
      mkdir         make directory on the remote machine
      mls           list contents of multiple remote directories
      mode          set file transfer mode
      modtime       show last modification time of remote file
      mput          send multiple files
      newer         get file if remote file is newer than local file
      nlist         nlist contents of remote directory
      nmap          set templates for default file name mapping
      ntrans        set translation table for default file name mapping
      open          connect to remote ftp
      passive       enter passive transfer mode
      prompt        force interactive prompting on multiple commands
      proxy         issue command on alternate connection
      put           send one file
      pwd           print working directory on remote machine
      qc            print ? in place of control characters on stdout
      quit          terminate ftp session and exit
      quote         send arbitrary ftp command
      recv          receive file
      reget         get file restarting at end of local file
      rename        rename file
      reset         clear queued command replies
      restart       restart file transfer at bytecount
      rhelp         get help from remote server
      rmdir         remove directory on the remote machine
      rstatus       show status of remote machine
      runique       toggle store unique for local files
      send          send one file
      sendport      toggle use of PORT cmd for each data connection
      site          send site specific command to remote server; try "rhelp site" or "site help" for more information
      size          show size of remote file
      status        show current status
      struct        set file transfer structure
      sunique       toggle store unique on remote machine
      system        show remote system type
      tenex         set tenex file transfer type
      tick          toggle printing byte counter during transfers
      trace         toggle packet tracing
      type          set file transfer type
      umask         get (set) umask on remote side
      user          send new user information
      verbose       toggle verbose mode