问题描述
我正在尝试使用 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
参数的值。如果不是,则需要匹配。