Installation

Install ipp-usb snap with

sudo snap install ipp-usb --edge

If you don’t use the --edge flag, you will get a message like this:

$ sudo snap install ipp-usb
error: snap "ipp-usb" is not available on stable but is available to install on the following
       channels:

       edge       snap install --edge ipp-usb

       Please be mindful pre-release channels may include features not completely tested or
       implemented. Get more information with 'snap info ipp-usb'.

Install sane and sane-utils packages with

$ sudo apt install sane sane-utils

saned provides the SANE daemon, which is the system service sane-utils includes the command line frontend scanimage, the saned server and the sane-find-scanner utility, along with their documentation

Once installed, we can check if the scanner is detected by turning it on and running the scanimage -L command with sudo:

$ sudo scanimage -L
...
device `pixma:04A91728_14FE41' is a CANON Canon PIXMA MX310 multi-function peripheral

As you can see, my Canon PIXMA MX310 was successfully detected.

If you take a look at the /etc/passwd and /etc/group files, you’ll notice that we now have a saned user and a couple of groups, scanner and saned:

$ cat /etc/passwd
...
saned:x:113:123::/var/lib/saned:/usr/sbin/nologin
$ cat /etc/group
...
scanner:x:122:saned
...
saned:x:123:

This is because, by default, the saned daemon is configured to run as the saned user, which we can check by looking at the contents of the /etc/default/saned file:

$ cat /etc/default/saned
# Defaults for the saned initscript, from sane-utils

# Set to the user saned should run as
RUN_AS_USER=saned

Now, we need to configure sane to run as a server. To do so, add the following lines to /etc/default/sane, preferrably after the Defaults for the saned initscript comment:

# Set to yes to start saned
RUN=yes

In fact, you only need the RUN=yes part, but it’s always a good idea to have a comment that tells you what you’re configuring

Once you’ve saved the file, restart saned with the following command:

$ sudo systemctl restart saned.socket

Set user permissions

As we saw earlier, the saned daemon runs as its own user. However, to share the scanner over the network, we need to give that user the appropriate permissions to access the scanner.

We will do this by creating a udev rule that gives us that permisssion. But first, we need to know the vendorID and productID of our scanner.

To find those, run sane-find-scanner with root permissions:

$ sudo sane-find-scanner

found USB scanner (vendor=0x04a9 [Canon], product=0x1728 [MX310 series]) at libusb:001:007 found USB scanner (vendor=0x0424, product=0xec00) at libusb:001:003

If you get more that one scanner, as in this example, you can compare that to the output of lsusb, to find which IDs match your scanner

$ lsusb
Bus 001 Device 007: ID 04a9:1728 Canon, Inc. PIXMA MX310 series
...

As you can see, the very first one is our match. Now we can create our udev rule which should look something like:

ATTRS{idVendor}==“vendorID”, ATTRS{idProduct}==“productID”, MODE=”0664”, GROUP=”lp”, ENV{libsane_matched}=”yes”

To simplify things for yourself, you could also use the echo command as root, remembering to substitute with your own vendorID and productID:

sudo su

echo 'ATTRS{idVendor}=="0x04a9", ATTRS{idProduct}=="0x1728", MODE="0664", GROUP="lp", ENV{libsane_matched}="yes"' > /etc/udev/rules.d/49-sane-missing-scanner.rules

Now, still as root, add the saned user tot he lp group using gpasswd:

gpasswd -a saned lp

Then, plug the scanner out and plug it back in, and the file permissions should now be correect.

To verify, use the following command to start a shell as the saned user:

# su -s /bin/bash saned

And then, test with scanimage -L

saned@server$ scanimage -L
...
device `pixma:04A91728_14FE41' is a CANON Canon PIXMA MX310 multi-function peripheral

Share your scanner over the network

To share your scanner, we begin by configuring the machine that will act as the “print server”, to allow hosts on my network to access the printer.

Change the /etc/sane.d/saned.conf file with your preferences. For example, my network uses the 192.168.10.0/24 address range with a /24 subnet, which means that, under the ## Access list section, my configuration looks like this:

## Access list
...
localhost
192.168.10.0/24

Now, enable and restart saned.socket to restart the daemon.

$ sudo systemctl enable saned.socket
$ sudo systemctl restart saned.socket

Your scanner is now available over the network. If you use a desktop environment, you should be able to find it using the Add/Remove printers section of your distribution, as long as it has a graphical frontend like simple-scan, gscan2pdf or xsane.

Client Host configuration

If, like me, you don’t use a graphical Desktop Environment, but instead a window manager like dwm (shameless shilling, I know :-P), you’ll need to install sane and any specific utility similar to sane-airscan that allows your computer to connect to the external scanner that is available over the network.

Next, you’ll need to tell sane the location of your print server, by editing the /etc/sane.d/net.conf file with root privileges.

You’ll need to include the IP address of your print server. If you also have mDNS hostname resolution set up through avahi, it’s also a great idea to include that as well, like so:

$ sudo vim /etc/sane.d/net.conf
...
HOSTNAME.local
192.168.10.X

Now, on the Client host, run scanimage -L

$ scanimage -L
...
device `net:192.168.10.X:pixma:04A91728_14FE41' is a CANON Canon PIXMA MX310 multi-function peripheral

From here, you can fire up your scanning graphical frontend, and you should be able to scan any document remotely.