尝试通过 ssh 进入 pulumi 创建的 azure nextgen vm 时出现无效格式错误

问题描述

我正在尝试使用 azure nextgen Pulumi api 创建并通过 ssh 进入一个虚拟机。我正在运行 Window 10。

成功创建 VM 后,出于测试目的,我将私钥导出到文件,减少权限以避免“权限太开放”错误,然后运行 ​​ssh user@ip -i keyfile.rsa。但是,我收到错误Load key ... invalid format.

相关脚本如下:

const rsaKey = new tls.PrivateKey("rsaKey",{
    algorithm: "RSA",});

const vm = new azure_nextgen.compute.latest.VirtualMachine("vm",{
    location: resourceGroup.location,resourceGroupName: resourceGroup.name,vmName: "linuxvm",hardwareProfile: {
        vmSize: "Standard_B1ms",// may go up to standard b2ms
    },networkProfile: {
        networkInterfaces: [{
            id: networkInterface.id,}]
    },osProfile: {
        adminUsername: vmUser,computerName: "test-vm",linuxConfiguration: {
            disablePasswordAuthentication: true,ssh: {
                publicKeys: [{
                    keyData: rsaKey.publicKeyOpenssh,path: "/home/*username*/.ssh/authorized_keys",}]
            }
        }
    },storageProfile: {
        imageReference: {
            offer: "UbuntuServer",publisher: "Canonical",sku: "18.04-LTS",version: "latest",},osdisk: {
            caching: "ReadWrite",createOption: "FromImage",manageddisk: {
                storageAccountType: "Standard_lrs",name: "myVMosdisk",}
})

解决方法

关于要检查的事情的一些想法:

  • 如果您启用密码访问并登录实例,您是否根据您的代码看到给定用户下的公钥?
  • 当您在本地保存私钥时,它的格式是否正确 - 所以当您查看文件时,它看起来像这种块格式?
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNlY2RzYS
1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQR9WZPeBSvixkhjQOh9yCXXlEx5CN9M
yh94CJJ1rigf8693gc90HmahIR5oMGHwlqMoS7kKrRw+4KpxqsF7LGvxAAAAqJZtgRuWbY
....
EbAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBH1Zk94FK+LGSGNA
6H3IJdeUTHkI30zKH3gIknWuKB/zr3eBz3QeZqEhHmgwYfCWoyhLuQqtHD7gqnGqwXssa/
EAAAAgBzKpRmMyXZ4jnSt3ARz0ul6R79AXAr5gQqDAmoFeEKwAAAAOYWpAYm93aWUubG9j
YWwBAg==
-----END OPENSSH PRIVATE KEY-----
,

这是生成密钥然后将其写入文件的示例代码,然后可以与 ssh -i ... 一起使用 请注意使用 .apply() 呈现键值。否则,写入的文件将基本上包含错误/帮助消息,而不是私钥。

const sshKey = new tls.PrivateKey(`${projectName}-sshkey`,{
    algorithm: "RSA",});
const privateKeyPem = sshKey.privateKeyPem.apply(key => {
    fs.writeFile('privateKeyPem',key,(err) => {
        console.log("privateKeyPem saved")
    })
})

您的 VM 声明看起来不错。但为了确认一下,我假设您在 VM ssh 块的路径中显示的 *username* 实际上设置为您用于上面的 adminusername 参数的值。如果不是,则需要匹配。