我在另一个物理网络上的另一个远程系统上有一个服务,它的多播包没有到达我的本地系统,因此我看不到它的 DNS-SD 发布的服务。
我有一种方法可以在我的本地机器上手动注册它,以便只显示 DNS-SD 发现的服务的应用程序显示它?
使用 Avahi 可以创建临时注册,avahi-publish并且可以通过编写静态服务文件来创建持久注册。有关man 1 avahi-publish前者man 5 avahi.service的更多信息,请参阅后者的更多信息。
使用 Bonjour,dns-sd 工具可用于代理注册服务:
dns-sd -P <Name> <Type> <Domain> <Port> <Host> <IP> [<TXT>...]
如果您代理注册的服务已经有一个单播 DNS 主机名,这样的事情将起作用:
$ dns-sd -P Google _http._tcp local 80 google.com google.com path=/
Registering Service Google._http._tcp.local host google.com port 80 TXT path=/
4:23:00.928 Got a reply for service Google._http._tcp.local.: Name now registered and active
^C
如果它没有主机名,则应为主机使用唯一名称:
$ dns-sd -P Google _http._tcp local 80 google.local 74.125.237.144 path=/
Registering Service Google._http._tcp.local host google.local port 80 TXT path=/
4:16:48.208 Got a reply for record google.local: Name now registered and active
4:16:48.208 Got a reply for service Google._http._tcp.local.: Name now registered and active
^C
这正是我一直在寻找的。我想让一个位于非 OS X 系统上的服务从家庭网络外部可见。在这里的其他地方,我发现了如何使用 scutil 来查找我的 Back to My Mac 网络:
echo show Setup:/Network/BackToMyMac | scutil | sed -n 's/.* : *\(.*\).$/\1/p'
所以我可以用它来填充它:
BTMM=`echo show Setup:/Network/BackToMyMac | scutil | sed -n 's/.* : *\(.*\).$/\1/p'`
dns-sd -P <advertised host name> _ssh._tcp ${BTMM} 22 <real host name> <real IP address—could be a hostname if it resolves> path=/
这样做的美妙之处在于,只要 ZeroConf 的某个变体正在运行,我就不必记得在离开家之前做任何事情。我可以在任何地方宣传远程服务,使用它,然后删除广告。所以我运行命令,然后查看我的 Shell -> New Remote Command 对话框,它就在那里。然后我可以来回复制文件,运行命令,访问家庭网络,就像我在那里一样。