我正在开发一个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
我看到的一个区别是,在公钥的情况下,公钥是多行与单行。
任何人都能指出这个谜题吗?
答案 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加入已接受的版本。