Raspberry Pi network scanner
Transforming an old all-in-one HP printer/scanner into a networked scanner is quite easy on Debian Buster. The idea is to connect the scanner to a Raspberry Pi via USB, configure the SANE scanning daemon and allow remote clients to use it.
Server (Raspberry Pi)
Install the packages and configure the printer on the server:
apt install --no-install-recommends sane-utils hplip hp-setup -i
This created a saned user and a scanner group, unfortunately a bug in Buster requires to add a custom udev rule to give permission to the saned user to use the scanner[0]:
/etc/udev/rules.d/70-libsane-group.rules ENV{libsane_matched}=="yes", RUN+="/bin/setfacl -m g:scanner:rw $env{DEVNAME}"
Apply to rule with udevadm trigger or reboot the Pi.
At this point the saned user should be able to detect the scanner and use it[1]:
sudo -u saned sane-find-scanner sudo -u saned scanimage -L sudo -u saned scanimage -T
Once all these commands terminate without errors, the network part can be configured. The SANE daemon is a bit special for two reasons:
- It needs to be started by inetd (or its systemd replacement) that will launch it when a connection on port 6566 is made, a bit like a CGI script.
- Once it is started, it will instruct the client to make a second connection to another port, a bit like in FTP.
With that in mind, let's configure it:
/etc/sane.d/saned.conf data_portrange = 10000 - 10100 # You can leave this commented if you don't have a firewall 192.168.0.0/24
Start the inetd that will launch saned:
systemctl enable saned.socket systemctl start saned.socket
If you use a netfilter based firewall on the Pi (iptables or ufw), you should be able to use nf_conntrack_sane to automatically track and open the ports specified in data_portrange, but I couldn't get it to work. Instead I manually open all of them:
ufw allow from 192.168.0.0/24 to any port 6566 proto tcp ufw allow from 192.168.0.0/24 to any port 10000:10100 proto tcp
If when you try to scan something, it briefly works but hangs after a second, it is a sign that the first connection to port 6566 works, but the second connection to one port in the range 10000:10100 does not.
Client
Setting up the client is straightforward, see instructions on Debian Wiki.
Alternatives
- Using SSH port forwarding instead of the SANE daemon, more secure but requires connecting to the server before scanning.
- Pretending that the scanner is connected directly to the client with USBIP.
More information: