使用 ssh 和 Avahi 时遇到问题

tha*_*Guy 10 ssh lubuntu networking avahi

解决:确保安装了libnss-mdns!

我在使用 .local 主机名从上网本到桌面使用 SSH 时遇到问题。每隔一段时间,我都必须重置我使用的路由器,这会重置它分配给我的设备的地址,所以不久前我设置了 Avahi 来解决这个问题*。/etc/avahi/services/ssh.service 文件是从文档中复制的标准文件:

<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<!-- See avahi.service(5) for more information about this configuration file -->
<service-group>
    <name replace-wildcards="yes">%h</name>
       <service>
            <type>_ssh._tcp</type>
            <port>22</port>
       </service>
 </service-group>
Run Code Online (Sandbox Code Playgroud)

这曾经工作正常,但现在由于某种原因,当我尝试从上网本 ssh 到我的桌面时,我收到以下错误消息(注意我在此输出中更改了我的电脑的主机名):

user@netbook>> ssh pc.local -vvv
OpenSSH_6.2p2 Ubuntu-6ubuntu0.3, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /home/username/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: ssh_connect: needpriv 0
ssh: Could not resolve hostname pc.local: Name or service not known
Run Code Online (Sandbox Code Playgroud)

当我手动输入 IP 地址时,我可以从上网本 ssh 到我的 PC,并且当我正确设置 /etc/hosts 时(因此我 PC 上的守护程序工作正常),它只会在我尝试时停止工作使用 .local 地址。即使使用 .local 主机名,SSH 在另一个方向(PC->上网本)也能正常工作。Avahi 似乎也工作正常:

user@netbook>> avahi-browse -a -t+  
+  wlan0 IPv6 netbook                                  SSH Remote Terminal       local
+  wlan0 IPv6 netbook [<MAC address>]       Workstation                       local
+  wlan0 IPv6 netbook                                  Remote Disk Management local
+  wlan0 IPv4 netbook                                  SSH Remote Terminal       local
+  wlan0 IPv4 netbook [<MAC address>]       Workstation                       local
+  wlan0 IPv4 netbook                                  Remote Disk Management local
+  wlan0 IPv4 pc                                          SSH Remote Terminal       local
+  wlan0 IPv4 pc [<MAC address>]               Workstation                       local
+  wlan0 IPv4 pc                                          Remote Disk Management local
+  wlan0 IPv6 pc                                          SSH Remote Terminal       local
+  wlan0 IPv6 pc [<MAC address>]               Workstation                      local
+  wlan0 IPv6 pc                                          Remote Disk Management local
Run Code Online (Sandbox Code Playgroud)

上网本运行的是 Lubuntu 13.10;请注意,我最近确实改用了 Lubuntu,我只记得在 Lubuntu 上看到过这个错误,而在普通的 Ubuntu 上没有。我的桌面运行的是 Ubuntu 13.10。

任何帮助,将不胜感激!

*我知道可以将我的路由器设置为永久为两个设备提供设置地址,如果我无法解决此问题,我会这样做,但我更愿意尝试解决此问题而不是解决它。

ETA:使用 .local 主机名从上网本 Ping PC 不起作用(未知主机)。

编辑2:内容 /etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd:         compat
group:          compat
shadow:         compat
hosts:          files mdns4_minimal dns [NOTFOUND=return] mdns4
networks:       files
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:       nis
Run Code Online (Sandbox Code Playgroud)

use*_*.dz 12

嗯,*.local都没有解决。

所以在客户端机器(笔记本)上

  1. 安装 avahi-dnsconfd

    sudo apt-get install avahi-daemon avahi-dnsconfd avahi-discover avahi-utils
    
    Run Code Online (Sandbox Code Playgroud)

    avahi-dnsconfd听取发布并将它们传递给resolvconf.

  2. 安装libnss-mdns (此库丢失,在这种情况下安装它解决了问题)

    sudo apt-get install libnss-mdns
    
    Run Code Online (Sandbox Code Playgroud)

    nss-mdns 是 GNU C 库 (glibc) 的 GNU 名称服务切换 (NSS) 功能的插件,通过多播 DNS(使用 Zeroconf,又名 Apple Bonjour / Apple Rendezvous)提供主机名解析,有效地允许通用 Unix 进行名称解析临时 mDNS 域 .local 中的 /Linux 程序

  3. 查看 /etc/nsswitch.conf

    hosts:     files wins mdns4_minimal dns [NOTFOUND=return] mdns4
    
    Run Code Online (Sandbox Code Playgroud)

    如果您有一个配置了 resolve 的 DNS 服务器,它应该有mdns4_minimalmdns4之前[NOTFOUND=return]和之前。dns*.local

    wins如果您不使用 winbind/samba 来解析 Windows 共享主机名,请删除。

  4. 重启


调试提示:

  • 客户端机器(笔记本)

    1. 检查avahi-dnsconfd服务状态

      $ service avahi-dnsconfd status
      avahi-dnsconfd start/running, process 1548
      
      Run Code Online (Sandbox Code Playgroud)
    2. 运行avahi-discover,你的桌面应该列在 IPv4→local→Workstation

      屏幕截图中的示例mx5是我的 PC,其中salah-Aspire-5738另一台机器。

      在此处输入图片说明

    3. 查看 Avahi 是否可以解析主机名

      avahi-resolve -4 --name yourdesktop.local
      
      Run Code Online (Sandbox Code Playgroud)
    4. ping测试

      $ ping salah-Aspire-5738.local
      PING salah-Aspire-5738.local (192.168.1.3) 56(84) bytes of data.
      64 bytes from salah-Aspire-5738.local (192.168.1.3): icmp_seq=1 ttl=64 time=2.69 ms
      
      Run Code Online (Sandbox Code Playgroud)
  • 服务器机器(桌面),以防avahi-discover在客户端机器中没有列出服务器条目。

    1. 确认avahi-daemon已安装

      sudo apt-get install avahi-daemon avahi-dnsconfd avahi-discover avahi-utils
      
      Run Code Online (Sandbox Code Playgroud)

      avahi-daemon 提供服务发布。

    2. 检查其服务状态

      $ service avahi-daemon status
      avahi-daemon start/running, process 1517
      
      Run Code Online (Sandbox Code Playgroud)
    3. 默认avahi发布_workstation._tcp服务。检查使用avahi-discover本地,如果未列出尝试启用它/etc/avahi/avahi-daemon.conf(删除#

      publish-workstation=yes
      
      Run Code Online (Sandbox Code Playgroud)

      然后重启守护进程:

      sudo service avahi-daemon restart
      
      Run Code Online (Sandbox Code Playgroud)

      再检查一遍。