The Joys of Linux and Command-Line FTP Clients
Sunday, September 30th, 2007As part of my web hosting dealings I agreed to upload one of my (now ex-) clients’ sites to his new webhost. When I first offered I didn’t consider that the normal command-line FTP client (GNU FTP?) doesn’t recursively create subdirectories and stuff, so it was going to be an intensely laborious manual task of creating about fifty billion subdirectories; i.e. not possible.
As I do in these situations I unhesitatingly turned to Google, which came through with the goods in the form of lftp (lftp man page), a command-line FTP client that has a ‘mirror -R’ (reverse mirror) that mirrors your local directory to a remote site. “Oh, bomb, that’s perfect,” I thought to myself, and gleefully found that it was indeed installed on our ancient Red Hat Enterprise Linux 3 server.
Well ye olde lftp has some quirks and some foibles, at least for the young player like me. The foible I ran into was that lftp tries to make an SSL connection to the target server if it can. In my case it could indeed connect via SSL, but the SSL certificate wasn’t a “real” proper bought SSL certificate, it was a “fake” self-signed cert and lftp didn’t like that one bit. So it would connect to the remote server without complaining but then when I tried to make it do anything it would just refuse and say cd: Fatal error: SSL connect: self signed certificate.
To get around this I had to edit the config file to disable connecting via SSL. I couldn’t find a command-line option to do this so editing the config file was my only option. This involved adding the line ftp:ssl-allow false to the /etc/lftp.conf file, which probably isn’t ideal since that’s for the entire system but pfft, whatever. You can also create a user-specific config file for lftp in your home directory called ~/.lftp/rc if you don’t have full root access or you don’t want to ruin everyone else’s fun ;).
After making this change I reconnected to the remote server with the following commands:
lftp -u newsiteusername newsite.example.com Password: lftp newsiteusername@newsite.example.com:/> lcd /fake/local/website/directory lcd ok, local cwd=/fake/local/website/directory lftp newsiteusername@newsite.example.com:/> cd fake/remote/website/directory cd ok, cwd=/fake/remote/website/directory lftp newsiteusername@newsite.example.com:/fake/remote/website/directory> mirror -R
So that was the end of another enthralling adventure in the land of Linux web hosting.
