抱歉,如果有人已经通过其他方式询问过这个问题,我无法找到答案,并且在尝试弄清楚如何正确使用 avahi 时经历了非常糟糕的经历。
我已经avahi
正常工作,并且可以使用它来检测我的 wifiBrother
扫描仪。我可以通过发出以下命令找出它的 IP 地址
avahi-browse -arp|grep -i brother
因此我可以修改我的 sane 配置文件(从技术上讲,它是 sane 使用的兄弟配置文件:/etc/opt/brother/scanner/brscan4//brsanenetdevice4.cfg
并添加扫描仪的 IP 地址。
但是,如果网络出现故障,并且路由器为扫描仪分配了新的 IP 地址,则意味着我必须再次执行此过程。所以我在这里想,“这难道不是 avahi 的全部意义吗?不是必须输入 IP 地址吗?”因此我尝试将 avahi 主机名而不是 IP 地址添加到文件中:
DEVICE=brother-scanner-avahi , "MFC-avahi" , Unknown , IP-ADDRESS=BRNXXXXXXX.local
代替
DEVICE=brother-scanner-101 , "MFC-101" , Unknown , IP-ADDRESS=192.168.0.101
但这不起作用。好吧,确实brsaneconfig4 -p
有效,因为它只是将请求交给ping
可以很好地处理 avahi 主机名的服务器。xsane
(0.998) 只是说:
无法打开设备“brother4:net1;dev2”:参数无效
因此,我的想法是以某种方式设置一些内部静态 IP 来“解析”到 avahi ip。有什么办法吗?例如,如果我想要:
127.0.0.2
只是设备的(动态)解析的 avahi IP 地址名称的别名。有点像文件hosts
所做的相反的事情。我想这可能涉及bind
或squid
类似的东西,我没有经验,所以我不知道从哪里开始。
这是一台 Fedora Linux 机器。
编辑:顺便说一句,我想避免在路由器上执行此操作,因为我想知道是否有可能通过这种方式实现。
答案1
在 brsanenetdevice4.cfg 中,您可以使用主机名而不是 IP 地址,但配置变量的名称是 NODENAME。
例如,修改上面的案例,您可以使用:
DEVICE=brother-scanner-avahi , "MFC-avahi" , Unknown , NODENAME=BRNXXXXXXX.local
并且它将像打印时一样使用 avahi 进行解析。
答案2
好的,根据一位朋友的提示,他指出了 SU 对相关问题的另一个回答(使用 iptables 重定向 IP 地址),经过一些实验和反复试验,我找到了答案。下面就是答案,希望它也能帮助到大家:
诀窍是使用iptables
NAT。首先,我们选择(未分配/可用)IP 作为别名。例如 192.168.0.201(您知道路由器不会使用)。注意:不是使用范围 127.0.0.x 因为它不起作用!
然后将其添加到sane
扫描仪的定义中。在我的例子中,文件是/etc/opt/brother/scanner/brscan4/brsanenetdevice4.cfg
。所以我添加了以下行:
DEVICE=brother-scanner-avahi-alias , "MFC-avahi-alias" , Unknown , IP-ADDRESS=192.168.0.201
然后我创建了一个包含以下内容的脚本:
ALIAS_IP=192.168.0.201
BROTHER_UNIQ_STR=MFC-YOUR-MODEL-HERE
BROTHER_SCANNER_IP=`avahi-browse -rpt _ipp._tcp|grep $BROTHER_UNIQ_STR|awk 'BEGIN {FS=";"} /^=/ { print $8}'`
# $7 is the .local hostname
# avahi-browse -rpt _ipp._tcp|grep $BROTHER_UNIQ_STR|awk 'BEGIN {FS=";"} /^=/ { print $7, $8}'
# to complete this: iptables-save >/somepath/iptables.save Add to cron upon start up iptables-restore </somepath/iptables.save
########
echo Brother scanner IP: \'$BROTHER_SCANNER_IP\'
if [[ $BROTHER_SCANNER_IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
# enable IP forwarding in kernel:
sysctl net.ipv4.ip_forward=1
# To make it permanent, edit /etc/sysctl.conf and ensure that the line "net.ipv4.ip_forward = 1" is there and not commented out.
iptables -t nat -A OUTPUT -d $ALIAS_IP -j DNAT --to-destination $BROTHER_SCANNER_IP
# Print the OUTPUT rules after our changes:
# iptables -t nat -L
iptables -t nat -L OUTPUT
# If you really mess up, or want to get rid of all your rules (careful with this command!!)
# TO DELETE ALL RULES ("F"lush) run: iptables -t nat -F OUTPUT
else
echo
echo "ERROR: bad ip address"
echo
exit 1
fi
运行该脚本,现在sane
应该能够通过别名 IP 地址检测到您的扫描仪。然后,您可以将脚本添加到 cron 作业或启动脚本(自动启动,或您的系统使用的任何脚本),这样每次都会为您处理好一切。
该脚本必须以超级用户(root)或sudo身份运行。
希望这对某些人有帮助。
编辑:
因此,差不多 4 年后,我终于解决了avahi
问题的相关部分。似乎在多年前从 Fedora 迁移到 Fedora 的过程中,一些东西仍然有问题(至少在我的系统上),而这似乎是其中之一,因为它硬编码了 avahi 套接字的路径,并忽略了 systemd avahi文件的指令。/var/run
有关更多信息,请参见此处:/run
nss-mdns
.socket
ListenStream=
无法 ping .local 域,但 avahi 可以。
既然这个方法有效,我就不需要再费力了iptables
。但这仍然是一次有趣的学习经历。