获取静态 IP 作为 avahi 解析的动态 IP 的别名 - 用于 sane 扫描仪

获取静态 IP 作为 avahi 解析的动态 IP 的别名 - 用于 sane 扫描仪

抱歉,如果有人已经通过其他方式询问过这个问题,我无法找到答案,并且在尝试弄清楚如何正确使用 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所做的相反的事情。我想这可能涉及bindsquid类似的东西,我没有经验,所以我不知道从哪里开始。

这是一台 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有关更多信息,请参见此处:/runnss-mdns.socketListenStream=无法 ping .local 域,但 avahi 可以

既然这个方法有效,我就不需要再费力了iptables。但这仍然是一次有趣的学习经历。

相关内容