Getting Data Off a z/OS Mainframe Without Losing Your Mind
IBM FTP on a mainframe isn't the same thing as FTP on a Linux server. The protocols are related, but the reality of using it day-to-day is shaped by decades of legacy decisions, COBOL-era constraints, and a culture that treats batch processing as a religion. If you're coming from modern cloud environments, this will feel like driving a tank. The manual mode you're asking about—where you sit at a TSO prompt and type ftp commands directly—is still used. Not because it's the best way, but because sometimes the automated jobs fail, someone needs to verify a file transfer happened, or you're dealing with a system that predates any orchestration tool you'd normally use. I use it maybe twice a month now. Mostly when something else broke.
What Ibm Ftp Manual Mainframe Actually Looks Like
You start by accessing the mainframe through TN3270 or a similar terminal emulator. From your TSO session, you type ftp and hit enter. It drops you into FTP interactive mode. From there you connect to the remote host, switch between mainframe and PC file formats, and transfer files one at a time. That's the basic shape of it. The command syntax is largely compatible with standard RFC 959 FTP commands, but there are enough IBM extensions and idiosyncrasies that copying a generic script verbatim usually fails. Here's what the flow actually looks like in practice: ftp hostname
User ID and password prompts follow. Then you're in. The default transfer mode on z/OS is often ASCII or EBCDIC depending on how the site is configured, and this is where people get burned. If you're transferring a binary file—say, a fixed-block data set that happens to contain PDFs or Excel spreadsheets—and you don't explicitly set type image, you'll get garbage on the other end. The file appears to transfer successfully. No error messages. Just corrupted data. I spent two days once chasing a problem where a GLM-format file kept arriving as random characters. The root cause was that the receiving end had an autoswitch policy that converted everything to ASCII, and the sending side was defaulting to EBCDIC. We ended up forcing type image on both ends and using lrecl and recfm parameters explicitly in the dataset allocation. That worked. It's not elegant but it's reliable. Some commands you'll use constantly:
Get the Full Details
quote site lrecl=80 recfm=fb blksize=27920 — sets the dataset attributes for the next transfer type image — forces binary mode type ascii — forces text mode (risky on mainframe unless you know what you're doing)
cd /path/on/remote — navigate remote directory lcd C:\local\path — navigate local directory put filename — upload
get filename — download bye — exit The quote command is important. It lets you send site-specific parameters that aren't part of standard FTP. On z/OS, these often include dataset allocation details, character set specifications, and CCSID settings that determine how text is encoded during transfer.

The Counter-Intuitive Part Nobody Teaches You
Most people assume FTP on mainframe is slow. It can be, but that's usually a configuration problem, not a protocol problem. The real bottleneck is how z/OS handles dataset allocation during transfers. When you put or get a file, the system may need to allocate a new temporary dataset, run through catalog searches, and manage tracking data. This is where JCL-level FTP job steps exist—they pre-allocate datasets and run the transfer in batch, which is dramatically faster for large volumes. Another thing that catches people: FTP over TLS (FTPS) works on z/OS, but the certificate management is handled through GSK (GSKit), not through your operating system's certificate store. If you're setting up a secured connection and it's failing with handshake errors, check whether the CA certificate for the destination is imported into the correct GSK keyring. This is not obvious from any error message. The FTP command just returns "connection refused" or hangs indefinitely. I also learned the hard way that passive mode on z/OS FTP is not always the default and sometimes doesn't work cleanly through certain firewall configurations. If you're behind a NAT or corporate proxy, active mode might actually connect more reliably than passive, which is backwards from everything you'd expect on a modern PC. Set passive mode explicitly with passive on, and if that fails, turn it off and try active.
One more practical detail: the maxconn command. By default, z/OS FTP limits concurrent connections per user. If you're running a batch transfer of hundreds of files, you might hit this limit and get errors mid-transfer. The workaround is either increasing the limit via the ftpd.cnf configuration file or breaking your transfers into smaller groups. I usually go with the second approach because changing site configuration requires coordination with the mainframe operations team and approval workflows that take weeks.
When Manual FTP Is the Right Call
I shouldn't pretend this is the best method for regular use. For production volume, JCL-based FTP jobs or automation tools like Autosys, Control-M, or even Python scripts using the ftplib module are far better. Manual FTP is for ad hoc transfers, troubleshooting, single-file moves, or situations where you need to verify exactly what's happening step by step. The main downside is that it's tedious and error-prone by nature. You're typing commands at a terminal with limited feedback. There's no easy way to script it without wrapping it in a CLIST or REXX program, and even then you lose the interactivity that makes manual mode useful for debugging. If you find yourself doing the same transfer repeatedly, you're already past the point where manual FTP makes sense. There's also the character encoding issue that never goes away. EBCDIC to ASCII conversion is automatic in ascii mode, but the mappings are lossy. Special characters, accented letters, and non-Latin scripts don't survive the conversion cleanly. If your data includes any of that, use type image and handle the encoding on the application side instead of relying on FTP to do it for you.

For reference documentation, IBM publishes the z/OS Communications Server: IP User's Guide and z/OS V2R3.0 which covers the FTP server and client in detail. The manual is dense but it's the primary source. There's also the z/OS MVS Initialization and Tuning Reference for the ftpd.cnf configuration parameters that control server behavior. Those two documents together should cover most of what you'll need, even if reading them feels like pulling teeth.