![](/img/trans.png)
[英]How can i login to VM using Azure Bastion Host Other than Azure portal web based SSH?
[英]How can I get the ssh host key for a new Azure Linux VM created using PowerShell?
如果使用PowerShell創建Azure Linux VM,如何獲得其新的ssh主機密鑰,以便可以將其安裝在本地ssh / putty中? 優選地,解決方案也是PowerShell代碼。
這是個老問題,但是對於新手來說,如今可以使用Azure CLI中的運行命令來替代。 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文件的例子。
RSA,DSA,ECDSA和ED25519密鑰在首次引導時生成,並且可在引導診斷日志中使用。
如果您在第一次啟動時沒有抓住它,那么我認為它不會在門戶網站的其他任何地方列出。 對於為已部署的VM恢復指紋,我可以考慮的只有一種可行,安全的選項。
檢查另一個磁盤上生成的/etc/ssh/ssh_host_rsa_key.pub
文件的指紋 。
ssh-keygen -lf /{path}/ssh_host_rsa_key.pub
如果需要十六進制編碼的MD5哈希,則可能需要添加-E 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問題的答案。
您可以使用Azure Portal的新 “運行命令”功能 。
粘貼以下命令:
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的答案中。
另請參閱我的完整指南,了解如何使用SFTP安全連接到Microsoft Azure服務 。
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
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參數用於傳遞密鑰對,而不僅僅是傳遞公共密鑰。 -證書可以在Windows上處理兩種類型。
在他們的幫助文檔中,有一個頁面討論如何重置密碼或ssh密鑰:
https://docs.microsoft.com/zh-cn/azure/virtual-machines/linux/troubleshoot-ssh-connection
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.