如何在Powershell中使用New-Item cmdlet将SSH私钥写入文件?

时间:2017-04-05 19:56:17

标签: windows powershell

我正在开发一个Powershell脚本,它从文件中读取ssh密钥和已知主机,并将其写入另一个文件。

我用

读了这把钥匙
$SshPrivateKey = Get-Content 'ssh-keys\id_rsa'

然后我用

编写新文件
New-Item -path $SshKeysDir -Name $SshPrivateKeyFile -Value $SshPrivateKey -ItemType file -force

使用公钥可以正常工作。但由于一些奇怪的原因,它不能与私钥一起使用。新文件最终只有

System.Object[]

作为我正在使用的解决方法

$SshPrivateKey > $testpath

正确写入文件。将内容写入控制台也会呈现预期的私钥

Write-Output $SshPrivateKey

最让我困扰的是它适用于其他文件,例如公钥或已知主机。只是不是私钥文件。 公钥的工作命令如下所示

New-Item -path $SshKeysDir -Name $SshPublicKeyFile -Value $SshPublicKey -ItemType file -force

我看到的一个区别是,在公钥的情况下,公钥是多行与单行。

任何人都能指出这个谜题吗?

1 个答案:

答案 0 :(得分:2)

这里的问题完全取决于您将文件读入变量的方式。

Get-Content的工作方式(详细here)是它将文件作为一个行数组读取。参考上面的链接:

  

它一次读取一行内容并返回一组对象,每个对象代表一行内容。

对于单行文件,这最终会被简化以便于使用。打印此数组最终会以您期望的方式打印,因为Powershell中的打印方式不会像New-Item那样将其转换为字符串。

一种简单的检查方法是只调用对象的GetType()方法:

PS > $singleLineFileContent.GetType();

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

PS > $multiLineFileContent.GetType();

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

因此,为了解决您的实际问题,您只需要make sure you read the file as a string properly.如果您运行的是3.0或更高版本,则需要this answer加入已接受的版本。