Command-line FTP function does not work

You'll usually see this type of thing happen when the server tries to connect back to you but can't. FTP originally used two TCP channels. One was for commands, and the other for transferring data. When you run the dir command it uses a data channel. The data channel is established on demand and results in the server trying to connect back to you.

That's most likely being blocked by your router or Windows firewall. You need a client that supports PASV mode.

You can enable PASV mode in Internet Explorer. Or use a different client. I'm not sure if the command-line version can use PASV mode. It's a very basic client.

I had an issue with transmitting files via FTP once I was logged into the box in question. It would create the file name, but the file was empty. I resolved it by doing the following:

  • Go to Control Panel → Windows Firewall → Advanced Settings → Inbound Rules
  • Double-click the Name column to sort by name
  • Scroll down until you see two rules called "File Transfer Program"; these were set to Block on my PC (big red circle with a line through it)
  • Double-click on the rule
  • On the General tab, under Action, set to Allow the connection
  • Click OK
  • Do this for the other rule

It should be good to go now.

Windows FTP command-line client ftp.exe supports an active FTP mode only.

Setting up the FTP in the active mode can be cumbersome nowadays due to firewalls and NATs.

It's likely because of your local firewall or NAT that the server was not able to connect back to your client to establish data transfer connection for the directory listing (ls or dir commands).

Or your client is not aware of its external IP address and provides an internal address instead to the server (in PORT command), which the server is obviously not able to use.

See my article Network Configuration for Active Mode.

If possible, you should use a passive mode as it typically requires no additional setup on a client-side.

Unfortunately Windows FTP command-line client (the ftp.exe) does not support passive mode at all. It makes it pretty useless nowadays.

Use any other Windows FTP command-line client instead. Most other support passive mode.

For example WinSCP defaults to passive mode and there's a guide available for converting Windows FTP script to WinSCP script.

(I'm the author of WinSCP)