Send Commands To All Installed Printers

Using a simple for  loop, you can send a PJL command to all of the printers installed on your machine.  For instance, if you wanted to change the display message on all your networked HP printers, you could loop through all the IP addresses and send it a command.

Finding The Printers

The command below will show you only the IP addresses of the printers (that are installed on your Mac), which you can then use in the for  loop.

lpstat -s | grep 'lpd\|ipp' | awk -F'/' '{print $3}'

If you want to find the types of devices on your network and their information, you will need something like nmap.

If you wanted to get just the USB printers, you could use this command:

lpstat -s | grep usb | awk -F':' '{print $NF}'

or if you just want to get every printer name:

lpstat -p | awk '{print $2}'

Change Settings On Physical Printers

If you want to change the settings on the printer itself–as you might do through a Web interface–you can send PJL commands, which will change the printer settings on the device.

Send PJL Commands To Every Networked Printer

Make a loop to send the PJL file to each IP address of the printers you have installed on your Mac.  This sends the PJL file to the printer on port 9100 using netcat.  The printer will recognize the file as commands and will execute them instead of printing the file.

allPrinterIPs=$(lpstat -s | grep lpd | awk -F'/' '{print $3}')
for p in ${allPrinterIPs[@]}
do
	cat changeReadyMessage.pjl | nc "$p" 9100
done

PJL commands can modify a lot of things: anything from duplex settings to changing serial numbers.

Change Printer Settings On A Computer

Alternatively, you can send out a script that will change the preferences of all installed printers on someone’s Mac.  You may run into issues if the printer does not support the command, but this can be useful in environments where all the printers are similar.

Enable Duplexing

You can use also lpadmin  to adjust settings of all installed printers.  Be careful here, too, as the Duplex command is probably different for every printer.  The command below is for a Brother 5340D as it was a simple example to illustrate how to change it.  If you want a more detailed example, check out this macmule article.

allPrinterNames=$(lpstat -p | awk '{print $2}')
for p in ${allPrinterNames[@]}
do
	# Use lpoptions -p PRINTER_NAME -l to see all available options for your printer--it will probably be different that what's below
	lpadmin -p "$p" -o Duplex=None
done

If you want to see what options are available to change on a specific printer, use this command:

lpoptions -p PRINTER_NAME -l

Disable Printer Sharing

If you wanted to systematically test if the printers are working and have the correct IP address by sending all printers a test page (showing the IP address of the machine), you could do this:

allPrinterNames=$(lpstat -p | awk '{print $2}')
for p in ${allPrinterNames[@]}
do
	lpadmin -p "$p" -o printer-is-shared=false
done

Systematically Print A Test Page On Every Networked Printer

If you wanted to systematically test if the printers are working and have the correct IP address by sending all printers a test page (showing the IP address of that device), you could do this:

allPrinterIPs=$(lpstat -s | grep lpd | awk -F'/' '{print $3}')
for p in ${allPrinterIPs[@]}
do
	echo "I think my IP adress is: $p" | lpr -P "$p" -p
done

Much easier than creating a document and manually sending it to each printer!

Leave a Reply