Printer Sharing

This document discusses several ways to configure printer sharing.

The Basics

A "server" is any machine that communicates directly to a printer. A "client" is any machine that sends print jobs to a server for final printing. Clients can also be servers if they communicate directly with any printers of their own.

By default, CUPS uses the Internet Printing Protocol (IPP) to send jobs from a client to a server. When printing to legacy print servers you may also use the Line Printer Daemon (LPD) when printing to older UNIX-based servers or Server Message Block (SMB) when printing to Windows® servers.

Clients can automatically discover and access shared printers via CUPS browsing, IPP, Service Location Protocol (SLP), and Lightweight Directory Access Protocol (LDAP). DNS Service Discovery (DNS-SD a.k.a. Bonjour®) and SMB browsing can also be used to manually discover and access shared printers.

Configuring the Server

You must enable printer sharing on the server before clients can print through it. The simplest way to do this is to use the cupsctl(8) command on the server:

cupsctl --share-printers

By default, the above command will allow printing from other clients on the same subnet as your server. To allow printing from any subnet, use the following command instead:

cupsctl --share-printers --remote-any

Next, you need to choose which protocols to use for printer sharing. The default is CUPS browsing and DNS-SD on Mac OS X and CUPS browsing alone on other platforms. To set the sharing protocols, run the cupsctl command to set the BrowseLocalProtocols value. For example, run the following command to allow shared printing via CUPS, DNS-SD, LPD, and SMB:

cupsctl 'BrowseLocalProtocols="cups dnssd lpd smb"'

Automatic Configuration using CUPS Browsing

CUPS browsing works by periodically broadcasting information about printers that are being shared to client systems on the same subnet. Each client maintains its own list of shared printers, and when more than one server shares the same printer (or the same kind of printer) the client uses all of the servers and printers to provide high-availability and failsafe printing.

To configure printers on the same subnet, do nothing. Each client should see the available printers within 30 seconds automatically. The printer and class lists are updated automatically as printers and servers are added or removed.

Note:

Due to user interface changes in Mac OS X 10.5, CUPS shared printers will not automatically appear in the print dialog. Instead, you must first run the following command to enable CUPS browsing on your system:

cupsctl BrowseRemoteProtocols=cups

Then choose each of the CUPS shared printers you want to see in the print dialog by adding them, either from the Add Printer... item in the print dialog or from the Print & Fax preference pane in the System Preferences window.

Seeing Printers on Other Subnets

You can automatically access printers on other subnets by adding BrowsePoll lines to the cupsd.conf file on your local system. For a single server you can use the cupsctl command:

cupsctl BrowsePoll=server:port

For multiple servers, use the CUPS web interface (http://localhost:631/admin) to edit the configuration file instead. Enter one BrowsePoll line per server at the bottom of the file, as follows:

BrowsePoll server1:port
BrowsePoll server2:port
BrowsePoll server3:port

If you have more than one client on your subnet that wants to see the printers on those servers, add a BrowseRely line to the cupsd.conf file on your local system using the cupsctl command:

cupsctl 'BrowseRelay="127.0.0.1 @LOCAL"'

or CUPS web interface (again, at the bottom of the file):

BrowseRelay 127.0.0.1 @LOCAL

Automatic Configuration using IPP

CUPS can be configured to run without a local spooler and send all jobs to a single server. However, if that server goes down then all printing will be disabled. Use this configuration only as absolutely necessary.

The default server is normally the local system ("localhost"). To override the default server create a file named /etc/cups/client.conf with a line as follows:

ServerName server

The server name can be the hostname or IP address of the default server. If the server is not using the default IPP port (631), you can add the port number at the end like this:

ServerName server:port

The default server can also be customized on a per-user basis. To set a user-specific server create a file named ~/.cups/client.conf instead. The user client.conf file takes precedence over the system one.

Finally, you can set the CUPS_SERVER environment variable to override the default server for a single process, for example:

CUPS_SERVER=server:port firefox http://www.cups.org

will run the Firefox web browser pointed to the specified server and port. The environment variable overrides both the user and system client.conf files, if any.

Manual Configuration of Print Queues

The most tedious method of configuring client machines is to configure each remote queue by hand using the lpadmin(8) command:

lpadmin -p printer -E -v ipp://server/printers/printer

The printer name is the name of the printer on the server machine. The server name is the hostname or IP address of the server machine. Repeat the lpadmin command for each remote printer you wish to use.