如果我使用 PowerShell 创建 Azure Linux VM,如何获取其新的 ssh 主机密钥,以便可以将其安装在本地 ssh/putty 中?最好的解决方案也是 PowerShell 代码。
6 回答
老问题,但对于新手来说,现在可以通过在 Azure CLI 中使用 run-command 来替代。PowerShell 也可能有一个等价物,但我没有对此进行调查。
az vm run-command invoke --name <your-vm-name> --command-id RunShellScript --scripts "cat /etc/ssh/ssh_host_ecdsa_key.pub"
将输出一个 json 文档,您可以从中提取公钥。请注意,尽管此过程非常慢(每个主机约 30 秒),但您只需要运行一次。有关如何使用 Ansible 更新 known_hosts 文件的示例,请参阅此要点。
您可以使用 Azure 门户的新 “运行命令”功能。
- 在您的虚拟机页面中,转到VM 菜单的“操作”部分中的“运行命令” 。
- 选择“RunShellScript”命令。
粘贴以下命令:
for f in /etc/ssh/ssh_host_*_key; do ssh-keygen -l -f "$f"; done
您将获得如下输出:
Enable succeeded: [stdout] 256 SHA256:bKKCom8yh5gOuBNWaHHJ3rrnRXmCOAyPN/WximYEPAU /etc/ssh/ssh_host_ecdsa_key.pub (ECDSA) 256 SHA256:IYeDl+gseYk46Acg4g2mcXGvCr7Z8FqOd+pCJz/KLHg /etc/ssh/ssh_host_ed25519_key.pub (ED25519) 2048 SHA256:rA0lIXvHqFq7VHKQCqHwjsj28kw+tO0g/X4KnPpEjMk root@myazurevm (RSA) [stderr]
(密钥类型集会因您的 VM 映像而异)
该功能也可以通过 Azure CLI 使用,如上面的链接和@mwik 的回答中所示。
RSA、DSA、ECDSA 和 ED25519 密钥在首次引导时生成,可在引导诊断日志中使用。
如果您在第一次启动时没有抓住它,我认为它不会在门户中的其他任何地方列出。我认为只有一种可行的、安全的选项可以恢复已部署虚拟机的指纹。
创建一个新的虚拟机。
附加需要指纹的 VM 的 VHD。
使用引导诊断中的指纹验证您与新 VM 的连接。
/etc/ssh/ssh_host_rsa_key.pub
检查另一个磁盘上生成文件的指纹。ssh-keygen -lf /{path}/ssh_host_rsa_key.pub
-E md5
如果您需要十六进制编码的 MD5 哈希,您可能需要添加开关。
电源外壳
要通过 PowerShell 获取启动诊断数据:
Get-AzureRmVMBootDiagnosticsData -ResourceGroupName ExampleGroup -Name TestLab -Linux
与腻子连接
Azure 将主机密钥指纹计算为公钥的SHA-256哈希的Base64 编码字符串。当您尝试使用Putty进行连接时,它会将指纹显示为公钥的MD5哈希的十六进制编码字符串。
幸运的是,Azure 还在启动诊断日志中列出了完整的公钥,它BEGIN SSH HOST KEY KEYS
在第二个图像中显示。有了它,我们可以手动计算 Putty 提供的指纹。
C#
static string ComputeMD5FingerprintFromBase64(string encoded)
{
// Convert Base64 string to byte array.
byte[] pub = Convert.FromBase64String(encoded);
// Compute MD5 hash.
HashAlgorithm md5 = MD5.Create();
byte[] hash = md5.ComputeHash(pub);
return BitConverter.ToString(hash).Replace('-', ':');
}
视窗
有关使用 RDP 安全连接到 Windows VM 的说明,请参阅我对此 StackOverflow 问题的回答。
Windows 虚拟机示例
Select-AzureSubscription mysub
$service = 'yourservicename1'
$location = 'West US'
New-AzureService -ServiceName $service -Location $location
Add-AzureCertificate -CertToDeploy 'D:User-DatadevelopmentAzure Samplesmlwdevcert.cer' -ServiceName $service
$cert1 = New-AzureCertificateSetting -Thumbprint D7BECD4D63EBAF86023BB4F1A5FBF5C2C924902A -StoreName 'My'
New-AzureVMConfig -ImageName 'MSFT__Windows-Server-2012-Datacenter-201208.01-en.us-30GB.vhd' -InstanceSize 'Small' -Name 'win2012cert' |
Add-AzureProvisioningConfig -Windows -Password 'somepass@1' -Certificates $cert1 | New-AzureVM -ServiceName $service
Linux 虚拟机示例
Select-AzureSubscription mysub
$service = 'yourservicename1'
$location = 'West US'
New-AzureService -ServiceName $service -Location $location
Add-AzureCertificate -CertToDeploy 'D:User-DatadevelopmentAzure Samplesmlwdevcert.cer' -ServiceName $service
$sshkey = New-AzureSSHKey -PublicKey -Fingerprint D7BECD4D63EBAF86023BB4F1A5FBF5C2C924902A -Path '/home/admin/.ssh/authorized_keys'
New-AzureVMConfig -ImageName 'CANONICAL__Canonical-Ubuntu-12-04-amd64-server-20120528.1.3-en-us-30GB.vhd' -InstanceSize 'Small' -Name 'linuxwithcert' |
Add-AzureProvisioningConfig -Linux -LinuxUser 'mwasham' -Password 'somepass@1' -SSHPublicKeys $sshKey |
New-AzureVM -ServiceName $service
注意: -Certificates 和 -SSHPublicKeys 参数是数组,因此它们可以接受多个证书。-SSHPublicKeys $sshKey1,$sshKey2
对于 Linux,还有 -SSHKeyPairs 参数用于传递密钥对而不仅仅是公钥。-Certificates 可以在 Windows 上处理这两种类型。
在他们的帮助文档中,有一个页面讨论了如何重置密码或 ssh 密钥:
https://docs.microsoft.com/en-us/azure/virtual-machines/linux/troubleshoot-ssh-connection