PRINTING IN LINUX WITH CUPS

Printing Programs

The four main printing programs in Linux today are:

  • lpr (note this is also called lpd; here I use the terms interchangeably)
  • lprng
  • pdq
  • cups

Note a few programs have their own printing system, such as StarOffice, and WordPerfect. They tend to be inferior in that the number of printer drivers available is often vary limited.

lpr

  • Sometimes referred to as BSD-style print queue or lpd.
  • Runs as root. The fewer root programs you run, the safer your system is.
  • Listens on all interfaces (including your internet interface). You cannot turn this off. Therefore, this is another security risk.
  • Really only does text or postscript on its own.
  • It can be coupled with Ghostscript to do graphics and support more printers.
  • Setting this up can be maddening, but it works ok (sans security) once it is setup.
  • lpr is the least common denominator of standards-based network printing.
  • lpr is widely supported.
  • From the Linux printing howto: "...recommend that people install and use CUPS or PDQ in most cases instead of (or in addition to) lpd."
  • Requires separate cups-lpd package.

lprng

  • Designed to be an improvement on lpr.
  • LPRng is far easier to administer for large installations than lpr.
  • It supports authentication via PGP or Kerberos.
  • LPRng uses more or less the same basic filter model as lpr. This means lpr print filters will work with lprng too.
  • The Linux printing howto does not recommend it.
  • As one user put it:
    ...LPRng, which is in my view an encoded acronym for "You Don't Need a printer." The BSD print arrangement could be understood with sufficient study, but with LPRng you're better off on a North Carolina beach with a metal detector, looking for treasure. Where configuring the BSD-style stuff would impart neurosis, LPRng can get you a new garment, one whose arms buckle in the back...I set about making LPRng work with my LaserJet III-D with PostScript cartridge. Two hours later, it was time to consider other options.

pdq

  • Wasn't able to get to the home page for this project, so I can't offer much info. (What I have is all second hand.)
  • It is one of the two printing systems recommended by the printing howto.
  • PDQ is perhaps the easiest to understand and use of the four printing systems, but it is not as powerful as CUPS.
  • No info on security was available for this presentation.
  • Samba (at least 2.08) does not seem to support pdq.

CUPS

  • Cups is recommended by the printing howto.
  • It supports a new internet standard: the Internet Printing Protocol (IPP).
  • IPP has been embraced by dozens of printer and printer server manufacturers and is supported by Microsoft Windows 2000.
  • IPP, and hence CUPS, supports access control, authentication, and encryption.
  • Since IPP runs over http, and CUPS supports IPP, users can check status information on a printer, manage their printers, and manage their jobs using their web browser.
  • Has several GUI's for configuring, or you can use a web browser.
  • Samba supports CUPS.
  • KDE 2.2 includes direct cups support. Of course, you can still use cups with KDE 2.1.
  • Can be configured to run on specific interfaces and specific ports.
  • The cups-drivers package contains drivers for roughly 1220 printers. This doesn't include printers that are compatible (i.e. There is no hp lj2100 driver, but this printer can use the hp lj6p drivers which are present.)
  • Has command line replacements for the lpr commands, but they support more options.
  • Cups is supported by: Caldera, Conectiva*, Debian, easyLinux*, HP-UX, IRIX, Linux Mandrake*, Peanut*, Red Hat, Solaris, SuSE, Tru64, UNIX, TurboLinux, and AIX. The ones with a * use cups as the primary printing system.

Installing CUPS

RPM installs

  • Get the rpms. If they are not included in your distribution, you can get them from
  • The latest version as of 07/06/01 is 1.1.9. There are two rpms: cups and cups-devel. The cups-devel is optional. Some rpm versions also include a third and fourth rpm: libcups1 and libcups1-devel.
  • The latest version of the cups-drivers can be found at The latest version is 1.0-31. Note this does require ghostscript.
  • SSL support requires the SSL libraries of course.
  • Warning: cups will overwrite your old printing system, especially lpr. Backup anything you want to save!
  • Remove the old lpr "rpm -e lpr". Install cups: "rpm -Uvh cups-1.1.8-Linux-2.4-intel.rpm" to install the rpm(s). Note if you have a problems installing cups, trying downloading a src rpm and compiling your own version (rpm --rebuild --target="i386" rpm-source-name).
  • Whichever way you install CUPS, don't forget to start it. This will vary depending on your system, but the command "/usr/sbin/cupsd" will usually work. Also, don't forget to put it in your startup files so when the occasion comes to reboot your machine, printing will still work.
  • If using UNIX Printing, you’ll need to install cups-lpd package.

Tarball installs

  • Get the tarball. If they are not included in your distribution, you can get them from
  • SSL support requires the SSL libraries of course.
  • cups-drivers tarball can be found at The latest version is 0.3.6. I believe this requires ghostscript.

Installing a New Printer via your web browser

Go to

Note:

  • You can change the port cups listens on but this is not recommended.
  • If cups is listening there, you can also use a different IP address.

If localhost resolves to 127.0.0.1 (as it should), you can use localhost instead of 127.0.0.1 .

Click on the add printer button

Enter root and root's password.

First page of the Add printer "wizard"

  • Now enter a name, location, and description.
  • The location and description are optional but recommended.
  • Here, you can see I entered myprinter, next to the computer, and optra E312. Enter whatever is appropriate for your printer.

Second page of the Add printer "wizard"

  • Select the device the printer is attached to. In my case, it is my parallel port #1 (Ignore the Epson part).
  • The various options are: Appsocket/HP JetDirect; Internet Printing Protocol (another cups printer, or perhaps a Windows 2000 shared printer); LPD/LPR Host or printer; parallel ports (there is a listing for each one); serial ports (there is a listing for each one); or Unknown Network Device (SMB).

Note for all attachments except parallel there is an extra step. This is discussed shortly.

Third page of the Add printer "wizard"

  • Select the manufacturer of your printer (or compatible printer driver). In my case, the Optra E312 is made by Lexmark.
  • The printer drivers mentioned above have 40 different manufacturers.

Fourth page of the Add printer "wizard"

  • Select the model/driver of/for your printer (or compatible printer driver). In my case, it is the Optra E312

Fifth (and last) page of the Add printer "wizard"

The New Printer is added!

Special Ports

  • For ports other than parallel, an extra page comes between the second and third page. An example is below.
  • To print to an lpd printer server, enter "lpd://hostname/queue" . You must know the hostname and the queue name. These are the names of the printer server, not your machine.
  • For things like an HP JetDirect (assuming you aren't using it's lpr support), enter "socket://hostname". Note at least some versions of the HP JetDirect firmware do not correctly implement IPP.
  • For print servers than support IPP, you can use either " or "ipp://hostname/ipp/printername". I haven't used this method myself yet.
  • For serial ports, set the settings to the correct value. The command "lpinfo -v" should at least tell you the baud rate.
  • To print to a SMB server (such as windows), be sure to read the Samba and cups section first! There are several ways to specify a SMB server. See the table below.

Username and password Not required / Username and password required
This machine is in the same workgroup / smb://server/sharename / smb://username:password@server/sharename
This machine is in a different workgroup / smb://workgroup/server/sharename / smb://username:password@workgroup/server/sharename

The cupsd.conf file

  • Like most servers in Unix, much of cups can be configured/controlled through the cupsd.conf file. Usually, this will be found in /etc/cups.
  • There are six different configuration files for cups. cupsd.conf is the only one you would normally edit by hand.
  • cupsd.conf has 69 different directives. We will only cover a few of them. See the official documentation for cups for information on the rest.

Portwalling

  • By default, cups will listen on every interface. Unless you want to offer your printer to the world, you must block this. Although you can firewall this (and that is a good idea anyway), you can also not have cups listen on your internet connection. This also prevents any possibility of a root exploit from the internet. Of course, you still have internal crackers to worry about...
  • In cups.conf, comment out the lines:
    Port 80
    Port 631
  • Replace them with:
    Listen 127.0.0.1:631
    Listen lan_ip_address:631
    Listen 127.0.0.1:80
    Listen lan_ip_address:80
  • Still leaves a UDP port 631 open to the world though. The simplest way to close this port is by turning browsing off, but it may cause problems if you have other cups servers (and maybe clients?). The line for this is:
    Browsing off
  • Another way to limit access to UDP on port 631, but less secure, is to add the following lines:
    BrowseAddress lan_ip_broadcast_address
    BrowseAddress 127.0.0.1
    BrowseAllow from 127.0.0.1
    BrowseAllow from lan_ip_subnet (i.e. 192.168.1.0/24)
    BrowseOrder deny,allow

Cups and Samba

  • Starting with Samba version 2.06, cups is supported.
  • If you are going to print to SMB servers, or allow clients to send print jobs to your cups server using the SMB protocol, you must install and configure Samba.
  • To configure Samba for CUPS (windows users can print to your cups server), edit the smb.conf file and replace the existing printing commands and options with the line:
    printing = cups
  • Versions of Samba older than 2.06 and broken versions of Samba (2.06 and 2.07 have been reported) require the following lines in your smb.conf file:
    printing = sysv
    printcap name = lpstat
    print command = lp -d %p -o raw %s; rm -f %s
  • You will also need to add a [printer] section to your smb.conf file. (Otherwise, you are sharing any printers!) Here is a sample one I use:
  • # NOTE: If you have a CUPS print system there is no need to
  • # specifically define each individual printer.
  • # You must configure the Samba printers as "Generic PostScript Printer"
  • # on your Windows clients.
  • # If you wish to configure the printers directly on the Windows clients
  • # (i.e. use the windows drivers on the clients) you must swap the
  • # 'print command' line below with the commented one.
  • [printers]
  • comment = All Printers
  • path = /var/spool/Samba
  • browseable = yes
  • # to allow user 'guest account' to print.
  • guest ok = yes
  • writable = no
  • printable = yes
  • create mode = 0700
  • # ======
  • # print command: see above for details.
  • # ======
  • print command = lpr-cups -P %p -o raw %s # using client side printer drivers.
  • # print command = lpr-cups -P %p %s # using cups own drivers (use
  • #generic PostScript on clients).
  • # lpr -P %p %s
  • lpq command = lpstat -o %p

lprm command = cancel %p-%j

  • To configure CUPS for SAMBA (cups can use printers on windows machines), run the following command:
    ln -s `which smbspool` /usr/lib/cups/backend/smb
    Your Samba installation or cups installation *MAY* have already done this, so check for link first.

Cups command line tricks and tips

  • Because cups has a command line equivalent to the lp and lpr commands (I prefer lpr), all the commands that worked with the old LPD print system still work exactly the same.
  • Only the lpr version of the commands will be presented here. The equivalent lp commands do differ in some cases.
  • Cups, however, adds a bunch of new options you can use that are not present in LPD.
  • Only a few of the options will be presented here. See the docs for the full list.

Basic print commands

  • To print to your default printer, use the command: "lpr filename".
  • To print to a specific printer, use the command "lpr -P printername filename".
  • To see what printers are setup, you can use the web page (see above), or use the command "lpstat -d -p". The -d tells you the default printer, and the -p lists the printers available, and their status.

Advanced print commands - Paper orientation and size

With cups, you can easily change the printout paper orientation.

  • To print portrait, you don't need any special options. It's the default.
  • To print landscape, "lpr -o landscape filename"

Cups also allows you to specific media size, type and source. Of course, your printer must support the options you choose. From the cups manual, the most common are:

  • Letter - US Letter (8.5x11 inches, or 216x279mm)
  • Legal - US Legal (8.5x14 inches, or 216x356mm)
  • A4 - ISO A4 (8.27x11.69 inches, or 210x297mm)
  • COM10 - US #10 Envelope (9.5x4.125 inches, or 241x105mm)
  • DL - ISO DL Envelope (8.66x4.33 inches, or 220x110mm)
  • Transparency - Transparency media type or source
  • Upper - Upper paper tray
  • Lower - Lower paper tray
  • MultiPurpose - Multi-purpose paper tray
  • LargeCapacity - Large capacity paper tray

To use these options, the command is "lpr -o media=option1,option2,etc filename". Multiple options are allowed, and they are not case sensitive. Note there are no spaces in the list!

Advanced print commands - Duplexing

  • If your printer supports its, CUPS can do duplexing from the command line.
  • To do duplexing, the command is "lpr -o duplexingoption filename" where duplexingoption is one of the following.
  • "sides=two-sided-short-edge" is the option suitable for landscape pages.
  • "sides=two-sided-long-edge" is the option is suitable for portrait pages.
  • CUPS default is to print on only one side of the paper, so while there is an option for this ("sides=one-sided"), you don't need it.

If your printer doesn't support duplexing, but you want to fake it, CUPS again has options to help.

  • Use the "-o page-set=set option" to select printing just the even or just the odd pages.
  • The set value is either even, for even numbered pages, or odd, for odd numbered pages.
  • The default is to print all pages. There is really is no option for this.

Advanced print commands - Range of Pages

  • The default is to print every page.
  • The "-o page-ranges=pages" option selects a range of pages for printing.
  • "pages" can be a hyphenated range such as 1-4, or a comma separated (no spaces!) list of pages, such as 3,5,6 or both, such as 3,4-6,8.
  • The pages are always printed in ascending order, regardless of the order they are listed in.

Advanced print commands - Combining Options

  • Cups allow multiple options to be combined. Simply add another -o to the command.
  • Suppose you wanted to print pages 3-4, and 6 landscape from the file myletter to the printer myprinter.
  • The command is "lpr -P myprinter -o landscape -o page-ranges=3-4,6 myletter".

Playing Nice with MS Windows Systems: Printing with CUPS in Samba 2.2.x

CUPS is a newcomer in UNIX printing. It convinced many people upon first trial already. It is easy to manage and run. However, quite a few new features in CUPS make it different from other, more traditional printing systems. Therefor a few things need to be learned before you master CUPS.

Configuring smb.conf for CUPS

Printing with CUPS in the most basic smb.conf setup in Samba 2.2.x only needs two settings: printing = cups and printcap = cups. While CUPS itself doesn't need a printcap anymore, the cupsd.conf configuration file knows two directives (example: Printcap /etc/printcap and PrintcapFormat BSD), which control if such a file should be created for the convenience of third party applications. Make sure it is set! For details see man cupsd.conf and other CUPS-related documentation.

If SAMBA is compiled against libcups, then printcap = cups uses the CUPS API to list printers, submit jobs, etc. Otherwise it maps to the System V commands with an additional -oraw option for printing. On a Linux system, you can use the ldd command to find out details (ldd may not be present on other OS platforms, or its function may be embodied by a different command):

transmeta:/home/kurt # ldd `which smbd`
libssl.so.0.9.6 => /usr/lib/libssl.so.0.9.6 (0x4002d000)
libcrypto.so.0.9.6 => /usr/lib/libcrypto.so.0.9.6 (0x4005a000)
libcups.so.2 => /usr/lib/libcups.so.2 (0x40123000)
libdl.so.2 => /lib/libdl.so.2 (0x401e8000)
libnsl.so.1 => /lib/libnsl.so.1 (0x401ec000)
libpam.so.0 => /lib/libpam.so.0 (0x40202000)
libc.so.6 => /lib/libc.so.6 (0x4020b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

The line "libcups.so.2 => /usr/lib/libcups.so.2 (0x40123000)" shows there is CUPS support compiled into this version of Samba. If this is the case, and printing = cups is set, then any otherwise manually set print command in smb.conf is ignored.