排查由于权限和所有权问题而导致的 Azure Linux VM 中的 SSH 连接问题

适用于:✔️ Linux VM

注意

本文中引用的 CentOS 是 Linux 分发版,将达到生命周期结束(EOL)。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期指南

本文提供了通过安全外壳(SSH)连接到 Linux 虚拟机(VM)失败的问题的解决方案,因为 RHEL 中的 /var/empty/sshd 目录、SUSE 中的 /var/lib/empty 目录或 Ubuntu 中的 /var/run/sshd 目录不存在,或者它不由根用户拥有,或者它不可写或世界可写。

现象

通过 SSH 连接到 Linux 虚拟机(VM)时,连接会失败。 可能会收到有关受影响目录的以下错误消息,具体取决于 Linux 分发版。

sudo tail /var/log/messages
sshd: /var/empty/sshd must be owned by root and not group or world-writable.  

原因

如果受影响的目录不是根用户拥有的,或者它是组可写目录或可写目录,则可能会出现此问题。

若要解决此问题,请使用以下解决方法之一:

解决方法 1:联机修复 VM

下面是两种脱机修复 VM 的方法:

使用串行控制台

  1. 从Azure 门户连接到 VM 的串行控制台

  2. 使用本地管理帐户及其相应的凭据或密码登录到 VM。

  3. 运行以下命令来解决权限和所有权问题:

    sudo mkdir -p /var/empty/sshd
    sudo chmod 755 /var/empty/sshd
    sudo chown root:root /var/empty/sshd
    

使用“运行命令”扩展

注意

此方法依赖于 Azure Linux VM 代理(waagent)。 因此,请确保代理安装在 VM 中,并且其服务正在运行。

在Azure 门户中,打开 VM 的“属性”窗口以检查代理状态。 如果代理已启用且状态为 “就绪 ”,请按照以下步骤更改权限:

  1. 转到Azure 门户,找到 VM 设置,然后选择“操作”下的运行命令”。

  2. 通过选择 RunShellScript>Run 执行以下 shell 脚本:

    #!/bin/bash
    
    #Script to change permissions on a file
    mkdir -p /var/empty/sshd;chmod 755 /var/empty/sshd;chown root:root /var/empty/sshd
    

  1. 脚本执行完成后,输出控制台窗口将显示“启用成功”消息。

如果可以通过 SSH 连接到 VM,并且想要分析运行命令脚本执行的详细信息,请检查 /var/log/azure/run-command 目录中的handler.log文件

解决方法 2:脱机修复 VM

注意

  • 如果 VM 串行控制台访问不可用且 waagent 未准备就绪,请使用此解决方法。
  • 在 Ubuntu 中 ,/var/run/sshd 目录在内存中运行。 重启 VM 也会解决此问题。 因此,不需要在 Ubuntu VM 中进行脱机故障排除。

下面是两种脱机修复 VM 的方法:

使用 Azure Linux 自动修复 (ALAR)

Azure Linux 自动修复(ALAR)脚本是使用 Azure 虚拟机修复命令修复 Linux VM 中所述的 VM 修复扩展的一部分。

按照以下步骤自动执行手动脱机过程:

注意

在以下步骤中,相应地替换 $RGNAME$VMNAME替换 $USERNAME、、 $PASSWORDrepairdiskcopy 值。

  1. 使用 az vm repair create 命令创建修复 VM。 修复 VM 具有附加有问题的 VM 的 OS 磁盘副本。

    az vm repair create --verbose -g $RGNAME -n $VMNAME --repair-username $USERNAME --repair-password $PASSWORD --copy-disk-name repairdiskcopy
    
  2. 登录到修复 VM。 装载和 chroot 到 OS 磁盘附加副本的文件系统。 按照详细的 chroot 说明操作

  3. 运行以下命令以解决权限和所有权问题:

    mkdir -p /var/empty/sshd
    chmod 755 /var/empty/sshd
    chown root:root /var/empty/sshd
    
  4. 应用更改后,运行以下命令 az vm repair restore 以执行与原始 VM 的自动 OS 磁盘交换。

    az vm repair restore --verbose -g $RGNAME -n $VMNAME
    

使用手动方法

如果串行控制台和 ALAR 方法都不适用于你或失败,则必须手动执行修复。 按照以下步骤将 OS 磁盘手动附加到恢复 VM,并将 OS 磁盘交换回原始 VM:

成功将 OS 磁盘附加到恢复 VM 后,请按照详细的 chroot 说明 将装载和 chroot 装载到附加 OS 磁盘的文件系统。 然后,按照“使用 Azure Linux 自动修复(ALAR)”部分中的步骤 3 来解决权限和所有权问题。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区