Ubuntu 24.04 安装 SANE 1.2.1 指南
Ubuntu 24.04 LTS 裸机安装 SANE 1.2.1 实测指南:apt/离线 deb/源码编译三方案对比,systemd socket 与 xinetd 双形态托管 saned,net 后端跨服务器网络扫描验证。
Ubuntu 24.04 安装 SANE 1.2.1 指南
目标:在 Ubuntu 24.04 LTS 服务器上从零完成 SANE 扫描框架的安装与网络扫描服务(saned)上线,覆盖在线仓库、离线 deb、源码编译三种安装方案与 systemd socket/xinetd 两种托管形态,并完成跨服务器网络扫描实测。已在 Ubuntu 24.04.5 LTS 裸机服务器实测通过。
一、环境信息
- 操作系统:Ubuntu 24.04.5 LTS(
cat /etc/os-release:PRETTY_NAME="Ubuntu 24.04.5 LTS"),内核 Linux 7.0.0-38-generic x86_64,systemd 255(255.4-1ubuntu8.18) - 实验拓扑:扫描服务器
scan-server(10.89.68.10),客户端scan-client(10.89.68.20),离线安装演示机offline-host(10.89.68.40),三台同内网互通 - 软件版本(
dpkg -l实查):
| 软件包 | 版本 | 说明 |
|---|---|---|
| sane-utils | 1.2.1-7build4 | scanimage/saned/sane-find-scanner 等命令与 systemd 单元 |
| libsane1 / libsane-common | 1.2.1-7build4 | SANE 后端库与 82 个配置文件 |
| sane | 1.0.14-18 | GUI/工具前端打包(scanadf/xcam/xscanimage) |
| sane-airscan | 0.99.29-0ubuntu4 | eSCL/WSD 无驱网络扫描驱动(依赖自动带入) |
⚠️ 实验约束说明:本篇实测在无 USB 扫描仪硬件的裸机服务器上进行,扫描流程使用 SANE 官方
test虚拟后端产生真实扫描数据(这是 SANE 官方提供的前端与链路测试手段,随 sane-backends 分发)。接上实体扫描仪后,差异仅在于设备列表会多出真实设备名,全部命令形态与流程完全一致。
二、前置条件
- 一台 Ubuntu 24.04 服务器(物理机或虚拟机均可),具备 sudo 权限的账户,本文以 root 演示。
- 服务器需开放 TCP 6566 端口(saned 默认端口,
/etc/services注册名sane-port,实查位于第 336 行:sane-port 6566/tcp sane saned # SANE network scanner daemon)。 - 计划接入实体 USB 扫描仪的,确认
lsusb能看到设备;本文以虚拟后端替代,不影响服务端流程。 - systemd 正常运行:
systemctl is-system-running返回running(本文实测回显:running)。
三、版本选型说明
| 选项 | 版本 | 获取方式 | 适用场景 |
|---|---|---|---|
| Ubuntu 仓库稳定版 | 1.2.1(1.2.1-7build4) | apt-get install | 生产首选:与发行版集成最好,安全更新随仓库推送 |
| 上游最新稳定版 | 1.4.0(2025-05-23 发布,查询日期 2026-10-29) | 官方源码包编译 | 需要 1.3+/1.4 新特性(如 saned 网络中继 -n、更多 eSCL 机型) |
| 离线 deb | 同仓库版 | 依赖闭包下载 + dpkg | 断网/隔离网段服务器 |
关键解读:Ubuntu 24.04 仓库的 1.2.1 比上游 1.4.0 落后两个 minor 版本,但对「本机/网络扫描服务」主线功能无差别;只有需要 saned 中继等新能力时才值得源码编译。版本数据来源:sane-project 官网 Latest News 与 GitLab Releases(查询日期 2026-10-29)。
四、方案 A:Ubuntu 仓库在线安装(apt,推荐)
本方案用 Ubuntu 官方仓库安装全套 SANE 组件,约 1 分钟完成,适合绝大多数可联网服务器。
4.1 更新索引并安装
apt-get update # 刷新仓库索引
实测回显(节选):
Hit:4 http://archive.ubuntu.com/ubuntu noble-backports InRelease
Reading package lists...
apt-get install -y sane sane-utils libsane1 sane-airscan # 安装工具链+后端库+无驱网络驱动
实测回显(节选,安装器输出较长,保留关键段):
Setting up sane (1.0.14-18) ...
Setting up sane-utils (1.2.1-7build4) ...
Adding saned group and user...
Processing triggers for libc-bin (2.39-0ubuntu8.9) ...
Processing triggers for dbus (1.14.10-4ubuntu4.1) ...
安装器完成了三件事:装入全部二进制与后端库;创建运行 saned 的专用系统用户 saned(getent passwd saned 实查回显:saned:x:102:105::/var/lib/saned:/usr/sbin/nologin,shell 为 nologin 无法登录,只能跑服务);尝试拉起 saned.socket(标准 systemd 服务器上此时已处于 listening 状态,见 4.3 验证)。
4.2 验证安装
dpkg -l | grep -E 'sane|libsane' | awk '{print $2, $3}' # 列出已装 SANE 相关包与版本
实测回显:
libsane-common 1.2.1-7build4
libsane1 1.2.1-7build4
sane 1.0.14-18
sane-airscan 0.99.29-0ubuntu4
sane-utils 1.2.1-7build4
scanimage -V # 前端与后端库版本自检
实测回显:
scanimage (sane-backends) 1.2.1-debian; backend version 1.2.1
4.3 saned.socket 状态验证与显式启用
systemctl enable saned.socket # 开机自启(已启用时幂等)
实测回显:
Created symlink /etc/systemd/system/sockets.target.wants/saned.socket → /usr/lib/systemd/system/saned.socket.
systemctl start saned.socket # 立即启动监听
systemctl status saned.socket --no-pager -l
实测回显:
● saned.socket - saned incoming socket
Loaded: loaded (/usr/lib/systemd/system/saned.socket; enabled; preset: enabled)
Active: active (listening) since Thu 2026-10-29 12:39:49 UTC; 5ms ago
Listen: [::]:6566 (Stream)
Accepted: 0; Connected: 0;
Tasks: 0 (limit: 2266)
Memory: 256.0K (peak: 256.0K)
CPU: 294us
再用端口视角复核一次:
ss -ltn | grep 6566 # 确认 6566 处于 LISTEN
实测回显:
LISTEN 0 4096 *:6566 *:*
💡 技术拓展:Linux 上「按连接拉起服务」的守护进程托管器不止 systemd socket 一家——
托管形态 原理 特点 systemd socket(本文主用) 内核监听端口,连接到达时拉起服务实例 无需额外软件、每连接独立实例、日志进 journal xinetd 传统超级守护进程,按配置 fork 服务 老系统兼容好,配置直观 独立常驻(saned -l) saned 自己监听并 fork 脱离 systemd 环境用,调试方便 本文实测环境为 systemd 服务器,主用 saned.socket,xinetd 形态在第十章做完整对比实测。
至此方案 A 安装完成。扫描功能验证与网络扫描服务配置见第八章起的实测。
五、方案 B:离线 deb 包安装(断网服务器)
断网或隔离网段的服务器无法 apt-get install,标准做法是:在一台同版本、同架构、可联网的 Ubuntu 24.04 服务器上下载依赖闭包 deb,再拷贝到目标机用 dpkg 安装。
5.1 在联网服务器上下载依赖闭包
mkdir -p /opt/sane-debs && cd /opt/sane-debs && rm -f ./*.deb
apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends sane-utils sane libsane1 2>/dev/null | grep '^\w' | sort -u)
实测回显(节选,共 233 个 deb / 177MB,含 SANE 全部递归依赖):
Get:233 http://archive.ubuntu.com/ubuntu noble-updates/universe amd64 systemd-standalone-sysusers amd64 255.4-1ubuntu8.18 [205 kB]
Fetched 184 MB in 1min 31s (2029 kB/s)
233
177M /opt/sane-debs
💡 说明:全闭包会把 systemd 等基础系统包也带上;目标机是标准 Ubuntu 24.04 时这些基础包通常已存在,实际只需拷贝 SANE 相关的少数 deb。若目标机是被裁剪过的精简系统,则按全闭包携带。
5.2 拷贝到断网服务器并安装
将 /opt/sane-debs/ 整目录拷贝到目标机同路径后执行:
dpkg -i /opt/sane-debs/sane-utils_*.deb # 先试单个包:会因缺依赖报错,属预期现象
实测回显(节选):
dpkg: error processing package sane-utils (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
sane-utils
依赖未满足时 dpkg 拒绝配置属正常行为,改用全量安装:
dpkg -i /opt/sane-debs/*.deb # 一次性安装全部 deb
实测回显(节选):
Processing triggers for libgdk-pixbuf-2.0-0:amd64 (2.42.10+dfsg-3ubuntu3.3) ...
Errors were encountered while processing:
/opt/sane-debs/systemd-standalone-sysusers_255.4-1ubuntu8.18_amd64.deb
/opt/sane-debs/systemd_255.4-1ubuntu8.18_amd64.deb
⚠️ 上面两条 systemd 报错出现在「目标机已装有 systemd 且版本接近」的场景:dpkg 拒绝用离线包覆盖系统核心组件,SANE 部分不受影响。标准服务器上建议先剔除 systemd 系列包再拷贝。
5.3 验证离线安装结果
scanimage -V
实测回显(在仅靠离线 deb 安装的干净 Ubuntu 24.04 系统上):
scanimage (sane-backends) 1.2.1-debian; backend version 1.2.1
六、方案 C:官方源码包编译安装 sane-backends 1.4.0
当需要上游新特性(1.4.0 的 saned 中继、新机型支持等)时,从官方源码包编译安装。以下过程在干净的 Ubuntu 24.04 系统上完整实测。
6.1 安装编译依赖
apt-get install -y build-essential libusb-1.0-0-dev libjpeg-dev libpng-dev zlib1g-dev pkg-config python3 wget
⚠️ 注意
python3是 configure 的硬性检查项,最小化安装的系统默认没有(实测踩坑:缺失时 configure 报configure: error: no suitable Python interpreter found,装上 python3 重跑即可)。
6.2 下载官方源码包并校验
从 GitLab Release 页下载 1.4.0 官方发布包(Release 页 Assets 区的 sane-backends-1.4.0.tar.gz,查询日期 2026-10-29):
cd /root
wget https://gitlab.com/-/project/429008/uploads/843c156420e211859e974f78f64c3ea3/sane-backends-1.4.0.tar.gz
实测回显(节选):
HTTP request sent, awaiting response... 200 OK
Length: 7505056 (7.2M)
2026-10-29 12:48:20 (1.14 MB/s) - 'sane-backends-1.4.0.tar.gz' saved [7505056/7505056]
sha256sum sane-backends-1.4.0.tar.gz
实测回显:
f99205c903dfe2fb8990f0c531232c9a00ec9c2c66ac7cb0ce50b4af9f407a72 sane-backends-1.4.0.tar.gz
将计算值与 Release 页附带的 sane-backends-1.4.0.sha256.txt 清单比对一致后再继续。
6.3 解压并配置
tar xzf sane-backends-1.4.0.tar.gz && cd sane-backends-1.4.0
./configure --prefix=/usr/local --sysconfdir=/etc
实测回显(开头与结尾节选):
checking for a BSD-compatible install... /usr/bin/install -c
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gcc... gcc
checking for C compiler default output file name... a.out
...(输出节选,实测首尾)...
****************************************************************
* Please be sure to read file PROBLEMS in this directory *
* BEFORE running any of the SANE applications. Some devices *
* may be damaged by improper operation, so please do heed this *
* advice. *
****************************************************************
结尾出现 PROBLEMS 提示块即 configure 成功(该提示是官方构建系统的固定收尾输出)。
6.4 编译与安装
make -j$(nproc)
实测回显(编译行节选,可确认构建版本为 1.4.0):
/bin/bash ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../include/sane -D_REENTRANT -DPATH_SANE_CONFIG_DIR=/etc/sane.d -DPATH_SANE_DATA_DIR=/usr/local/share -DPATH_SANE_LOCK_DIR=/usr/local/var/lock -DV_MAJOR=1 -DV_MINOR=4 -I. -I. -
make install
实测回显(节选,共 115 个 install 动作):
make[3]: Leaving directory '/root/sane-backends-1.4.0'
make[2]: Leaving directory '/root/sane-backends-1.4.0'
make[1]: Leaving directory '/root/sane-backends-1.4.0'
6.5 刷新动态库缓存并验证
首次运行源码版 scanimage 会报动态库找不到(/usr/local/lib 尚未进入加载器缓存):
/usr/local/bin/scanimage: error while loading shared libraries: libsane.so.1: cannot open shared object file: No such file or directory
执行一次 ldconfig 即修复(Ubuntu 默认 /etc/ld.so.conf.d/libc.conf 已含 /usr/local/lib,实查内容:# libc default configuration / /usr/local/lib):
ldconfig
/usr/local/bin/scanimage -V
实测回显:
scanimage (sane-backends) 1.4.0; backend version 1.4.0
ls -la /usr/local/lib/libsane.so.1* && ls /usr/local/bin/ /usr/local/sbin/
实测回显:
lrwxrwxrwx 1 root root 16 Oct 29 12:59 /usr/local/lib/libsane.so.1 -> libsane.so.1.4.0
-rwxr-xr-x 1 root root 195776 Oct 29 12:59 /usr/local/lib/libsane.so.1.4.0
/usr/local/bin/:
gamma4scanimage sane-config sane-find-scanner scanimage umax_pp
/usr/local/sbin/:
saned
⚠️ 与 apt 版共存:源码版装入
/usr/local(优先于/usr/bin),系统原 1.2.1 仍在/usr/bin。回退时执行make uninstall或直接删除/usr/local下的上述文件即可恢复仓库版。
6.6 从 Git 源码快照构建(备选,需 autotools 引导)
若下载的是 GitLab 仓库页的「Source code (tar.gz)」快照(而非 Release 资产包),目录里没有 configure,需先跑 ./autogen.sh 引导。实测踩坑实录(三连坑):
- 缺
autoconf-archive包:autogen.sh 报「It seems 'aclocal' could not find the autoconf macros used to check for C++ standard's compliance」,apt-get install autoconf-archive解决。 - 缺
autopoint:autoreconf 报Can't exec "autopoint": No such file or directory。Ubuntu 24.04 中 autopoint 已从 gettext 拆分为独立包,需apt-get install autopoint(装 gettext 不够)。 - 版本号错乱:快照无
.tarball-version时 autogen.sh 会从 ChangeLogs 重构版本,Git 标签 1.4.0 的快照里 ChangeLogs 只到 1.2.1,导致编译出「1.2.1」版本号(实测.tarball-version内容为1.2.1,scanimage -V显示 1.2.x)。
结论:优先使用 Release 资产包(自带 configure,无需 autotools 链,版本号正确),Git 快照仅在有未发布改动时使用。
七、方案对比与选择建议
| 维度 | A:apt 在线 | B:离线 deb | C:源码编译 |
|---|---|---|---|
| 版本 | 1.2.1(仓库当前) | 1.2.1 | 1.4.0(上游最新) |
| 是否需联网 | 是 | 仅下载机需要 | 是 |
| 安装耗时 | 约 1 分钟 | 拷贝+安装约 5 分钟 | 约 10 分钟(6 核实测) |
| 升级方式 | apt 升级随仓库 | 重新制作 deb | 重新下载源码包编译 |
| systemd 集成 | 完整(saned.socket 自带) | 完整 | 需自行配置单元文件 |
| 适用 | 绝大多数服务器 | 隔离网段 | 需要新特性/定制 |
选择建议:能联网选 A;断网选 B;要 1.4.0 新特性或二次开发选 C。
八、安装后基础配置:启用 test 后端并完成首次扫描
安装完成后先在无硬件环境下把扫描链路跑通。Ubuntu 24.04 的 dll.conf 中 test 后端默认被注释(实查第 95 行 #test),启用它:
sed -i 's/^#test$/test/' /etc/sane.d/dll.conf && grep -n '^test' /etc/sane.d/dll.conf
实测回显:
95:test
scanimage -L # 列出可用设备
实测回显:
Created directory: /var/lib/snmp/cert_indexes
device `test:0' is a Noname frontend-tester virtual device
device `test:1' is a Noname frontend-tester virtual device
💡 说明:首行的
Created directory: /var/lib/snmp/cert_indexes来自 sane-airscan 驱动首次初始化缓存目录,属正常一次性输出。
执行一次真实扫描出图(PNG 格式、75dpi、网格测试图):
scanimage -d test:0 --format=png --resolution 75 --test-picture Grid -o /root/scan-grid.png
ls -la /root/scan-grid.png && head -c 8 /root/scan-grid.png | od -A x -t x1z | head -1
实测回显:
-rw-r--r-- 1 root root 457 Oct 29 12:38 /root/scan-grid.png
000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 >.PNG........IHDR<
文件魔数 89 50 4e 47(PNG)确认输出为合法 PNG 图像,扫描链路(前端→后端→出图)全通。
8.1 实体扫描仪的权限前置(接硬件时)
接入实体 USB 扫描仪时,非 root 用户能否扫描取决于 udev 规则与用户组:Ubuntu 24.04 由 libsane1 附带的 /usr/lib/udev/rules.d/60-libsane1.rules(配套 99-libsane1.rules)把扫描仪设备节点授权给 scanner 组,把用户加入该组并重新插拔设备即可:usermod -aG scanner <用户名>。网络扫描服务端则无需此步(saned 以专用 saned 用户运行,设备经后端库访问)。
九、saned 网络扫描服务:systemd socket 托管(推荐)
saned 是 SANE 的网络扫描守护进程:客户端通过 net 后端连到服务器的 TCP 6566,saned 代表客户端调用本机后端完成扫描。Ubuntu 24.04 自带 systemd socket 单元,按连接拉起服务实例,是当前的推荐托管形态。
9.1 配置客户端白名单 saned.conf
/etc/sane.d/saned.conf 原始内容全部为注释(实测全文关键段):
## Daemon options
# data_portrange = 10000 - 10100
## Access list
#scan-client.somedomain.firm
#192.168.0.1
#192.168.0.1/29
#[2001:db8:185e::42:12]
#[2001:db8:185e::42:12]/64
在文件末尾追加允许的客户端网段(CIDR 写法,本文实测环境为 10.89.68.0/24):
printf '\n## Lab: allow LAN clients\n10.89.68.0/24\n' >> /etc/sane.d/saned.conf
tail -3 /etc/sane.d/saned.conf
实测回显:
## Lab: allow LAN clients
10.89.68.0/24
9.2 认识自带的 systemd 单元
systemctl cat saned.socket
实测回显(单元文件全文):
# /usr/lib/systemd/system/saned.socket
[Unit]
Description=saned incoming socket
[Socket]
ListenStream=6566
Accept=yes
MaxConnections=64
[Install]
WantedBy=sockets.target
systemctl cat saned@.service
实测回显(模板单元全文):
# /usr/lib/systemd/system/saned@.service
[Unit]
Description=Scanner Service
Requires=saned.socket
[Service]
ExecStart=/usr/sbin/saned
User=saned
Group=saned
StandardInput=null
StandardOutput=append:/var/log/saned.log
StandardError=append:/var/log/saned.log
Environment=SANE_CONFIG_DIR=/etc/sane.d
# Environment=SANE_CONFIG_DIR=/etc/sane.d SANE_DEBUG_DLL=255
[Install]
Also=saned.socket
逐项解读:saned.socket 在 6566 上监听(ListenStream=6566),Accept=yes 表示每个客户端连接都会实例化一个 saned@<连接标识>.service(并发上限 MaxConnections=64);saned@.service 以 saned 用户运行 /usr/sbin/saned,日志追加写入 /var/log/saned.log,并通过 SANE_CONFIG_DIR 指定配置目录。修改单元后需 systemctl daemon-reload 生效。
9.3 启用与验证
systemctl enable saned.socket
systemctl start saned.socket
systemctl status saned.socket --no-pager
实测回显:
● saned.socket - saned incoming socket
Loaded: loaded (/usr/lib/systemd/system/saned.socket; enabled; preset: enabled)
Active: active (listening) since Thu 2026-10-29 12:39:49 UTC; 1min 51s ago
Listen: [::]:6566 (Stream)
Accepted: 2; Connected: 0;
Tasks: 0 (limit: 2266)
Accepted: 2 表示已接收 2 个客户端连接(第十一章实测产生)。防火墙放行(如启用 ufw):ufw allow 6566/tcp。
十、xinetd 托管对比(兼容形态)
无 systemd 的老系统或习惯 xinetd 的运维团队可用超级守护进程托管 saned。先安装并停用 socket 形态避免端口冲突:
apt-get install -y xinetd
systemctl disable --now saned.socket
创建 /etc/xinetd.d/sane-port(实测配置全文):
service sane-port
{
port = 6566
socket_type = stream
protocol = tcp
wait = no
user = saned
group = saned
server = /usr/sbin/saned
disable = no
}
systemctl restart xinetd
ss -ltnp | grep 6566
实测回显:
LISTEN 0 64 *:6566 *:* users:(("xinetd",pid=2533,fd=5))
监听进程已是 xinetd。此时客户端照第十一章流程访问,实测 scanimage -L 同样返回两台网络设备(回显与 11.3 一致),证明 saned 对托管形态无感知。
两种形态对比:
| 维度 | systemd socket | xinetd |
|---|---|---|
| 按连接实例化 | saned@<id>.service,逐连接独立 | fork 子进程 |
| 并发控制 | MaxConnections=64 | xinetd per_source/cps 指令 |
| 日志 | journal + saned.log(单元定义) | syslog |
| 依赖 | systemd | 需安装 xinetd 包 |
| 建议 | 现代服务器首选 | 老系统/迁移过渡 |
实测完成后切回推荐形态:
systemctl disable --now xinetd
systemctl enable --now saned.socket
十一、网络扫描客户端配置(net 后端)
11.1 客户端安装与指向服务器
在客户端 scan-client(10.89.68.20)安装 sane-utils:
apt-get install -y sane-utils
实测回显(节选):
Setting up sane-utils (1.2.1-7build4) ...
Adding saned group and user...
Processing triggers for libc-bin (2.39-0ubuntu8.9) ...
确认 net 后端已启用(Ubuntu 默认启用,实查 dll.conf 第 10 行为 net),并把服务器 IP 写进 net.conf:
grep -n '^net' /etc/sane.d/dll.conf | head -1
printf 'connect_timeout = 60\n10.89.68.10\n' >> /etc/sane.d/net.conf
tail -2 /etc/sane.d/net.conf
实测回显:
10:net
connect_timeout = 60
10.89.68.10
net.conf 中 connect_timeout = 60 设定连接 saned 的超时秒数(默认注释为 60),第二行起每行一个 saned 服务器地址。
11.2 网络设备发现
scanimage -L
实测回显(客户端):
Created directory: /var/lib/snmp/cert_indexes
device `net:10.89.68.10:test:0' is a Noname frontend-tester virtual device
device `net:10.89.68.10:test:1' is a Noname frontend-tester virtual device
设备名前缀 net:10.89.68.10: 表明设备经 net 后端来自该服务器,服务端本机的所有后端设备(含实体扫描仪)都会透传到客户端列表。
11.3 远程扫描出图
cd /root && scanimage -d 'net:10.89.68.10:test:0' --format=png --resolution 75 --test-picture Grid -o remote-scan.png
ls -la remote-scan.png && head -c 8 remote-scan.png | od -A x -t x1z | head -1
实测回显:
-rw-r--r-- 1 root root 457 Oct 29 12:41 remote-scan.png
000000 89 50 4e 47 0d 0a 1a 0a >.PNG....<
PNG 魔数确认远程扫描成功出图。同时服务器侧查看连接处理日志:
journalctl --no-pager -u 'saned@*' -n 6
实测回显(服务端):
Oct 29 12:41:29 scan-server systemd[1]: Started saned@0-10.89.68.10:6566-10.89.68.20:50414.service - Scanner Service (10.89.68.20:50414).
Oct 29 12:41:29 scan-server saned[2436]: saned (AF-indep+IPv6+systemd) from sane-backends 1.2.1-debian starting up
Oct 29 12:41:29 scan-server saned[2436]: check_host: access by remote host: ::ffff:10.89.68.20
Oct 29 12:41:29 scan-server saned[2436]: init: access granted to saned-user@::ffff:10.89.68.20
Oct 29 12:41:29 scan-server saned[2436]: saned exiting
Oct 29 12:41:29 scan-server systemd[1]: saned@0-10.89.68.10:6566-10.89.68.20:50414.service: Deactivated successfully.
可以看到每个连接实例化为 saned@0-10.89.68.10:6566-10.89.68.20:50414.service,完成 check_host 白名单校验后授权访问,服务完即退出。
11.4 反向用例:未授权客户端被拒
把服务端 saned.conf 的授权网段临时注释(sed -i 's/^10.89.68.0\/24$/#10.89.68.0\/24/' /etc/sane.d/saned.conf)后,客户端再执行 scanimage -L:
No scanners were identified. If you were expecting something different,
check that the scanner is plugged in, turned on and detected by the
sane-find-scanner tool (if appropriate). Please read the documentation
which came with this software (README, FAQ, manpages).
服务端日志(节选):
Oct 29 12:42:10.710800 scan-server saned[2475]: init: access by host ::ffff:10.89.68.20 denied
Oct 29 12:42:10.710802 scan-server saned[2475]: saned exiting
init: access by host ... denied 即白名单拒绝实录。恢复授权行后客户端立即恢复设备列表。
十二、常见问题(FAQ)
Q1:手动前台调试 saned -d128 没有任何输出,进程秒退?
-d(debug)在不加 -l 时运行于 inetd 模式——saned 会把标准输入当作客户端连接来读,因此直接在终端跑会立刻读到非 socket 的 stdin 并退出。实测现象:timeout 5 saned -d128 返回码 0 且无输出,日志落在 syslog(journalctl -t saned),其中可见:
Oct 29 12:45:16 scan-server saned[2782]: handle_connection: processing client connection
Oct 29 12:45:16 scan-server saned[2782]: check_host: getpeername failed: Socket operation on non-socket
Oct 29 12:45:16 scan-server saned[2782]: init: access by host [error] denied
正确的前台调试姿势是加 -l(standalone 监听)与 -e(输出到 stderr):saned -l -d128 -e。实测一次完整客户端连接的调试日志(节选):
[saned] saned (AF-indep+IPv6) from sane-backends 1.2.1-debian starting up
[saned] do_bindings: [1] bind () to port 6566
[saned] run_standalone: spawning Avahi process
[saned] handle_client: spawning child process
[saned] check_host: access by remote host: ::ffff:10.89.68.20
[saned] check_host: access granted from IP address 10.89.68.20 (in subnet 10.89.68.0/24)
[saned] init: access granted
[saned] process_request: got request 1
Q2:调试日志出现 bind failed: Address already in use?
6566 端口被占用——最常见是 saned.socket 与 xinetd/独立 saned 同时托管。排查:ss -ltnp | grep 6566 看占用进程,二选一停掉另一个(systemctl disable --now saned.socket 或 systemctl disable --now xinetd)。实测调试日志中的对应行:[saned] do_bindings: [0] bind () to port 6566 → [saned] do_bindings: [0] bind failed: Address already in use。
Q3:客户端 scanimage -L 提示 No scanners were identified?
依次检查:① 服务端 saned.conf 是否包含客户端 IP/网段(见 11.4 反向用例);② 客户端 net.conf 是否写了服务器地址、dll.conf 的 net 行是否被注释;③ 服务器防火墙是否放行 6566(ss -ltn | grep 6566 在服务端应看到 LISTEN);④ 客户端与服务器 sane 版本差异过大时也可能协商失败,两端尽量同代版本。
Q4:/var/log/saned.log 是空的(0 字节),连接日志去哪了?
Ubuntu 24.04 的 saned@.service 虽把 StandardOutput 指向该文件,但 socket 激活的实例日志实际进了 journal。实测 ls -la /var/log/saned.log 显示 -rw-r--r-- 1 root root 0 Oct 29 12:41,而 journalctl --no-pager -u 'saned@*' 能取到完整连接日志(见 11.3)。排障以 journalctl 为准。
Q5:没有实体扫描仪,怎么验证部署是否成功?
启用官方 test 后端(第八章),它提供两台虚拟设备与完整的扫描参数(分辨率/模式/测试图等),可走通「发现→扫描→出图→网络共享」全部链路;接上实体扫描仪后只需替换设备名。本文全部实测即基于该方式完成。
Q6:源码编译后 scanimage -V 仍显示旧版本或报 libsane 找不到?
两类原因:① 忘跑 ldconfig(报 error while loading shared libraries: libsane.so.1,执行 ldconfig 即修复,见 6.5);② shell 命令缓存仍指向旧路径,执行 hash -r 后重试,或直接用绝对路径 /usr/local/bin/scanimage -V。
十三、卸载与清理
apt 安装的卸载(--purge 连配置文件一起删):
apt-get purge -y sane sane-utils sane-airscan && apt-get autoremove -y
实测回显(节选):
Removing sane-utils (1.2.1-7build4) ...
Processing triggers for man-db (2.12.0-4build2) ...
源码版卸载(在编译目录内):
cd /root/sane-backends-1.4.0 && make uninstall # 移除 /usr/local 下全部安装文件
ldconfig # 刷新动态库缓存
复核残留:
dpkg -l | grep -E 'sane|libsane' | wc -l && ls /etc/sane.d 2>&1
实测回显(purge 后):
0
ls: cannot access '/etc/sane.d': No such file or directory
包与配置目录均已清理干净(/etc/sane.d 随 libsane-common purge 删除;若想保留自定义配置可提前备份该目录)。
十四、参考链接
- 官方安装文档:
https://sane-project.org/source.html与仓库内INSTALL.linux - saned 手册:
https://sane-project.org/man/saned.8.html - sane-backends 1.4.0 Release:
https://gitlab.com/sane-project/backends/-/releases/1.4.0(查询日期 2026-10-29) - Ubuntu 包页:
https://packages.ubuntu.com/noble/sane-utils - 本专栏配套篇:《SANE 介绍与选型指南》《SANE 1.2.1 配置参数详解》《SANE 1.2.1 常用 CLI 命令与工具详解》