2017-04-05 57 views
1

我正在使用Powershell腳本從一個文件中讀取一個ssh密鑰和已知的主機,並將其寫入另一個文件。如何使用Powershell中的New-Item cmdlet將SSH私鑰寫入文件?

我閱讀

$SshPrivateKey = Get-Content 'ssh-keys\id_rsa' 

關鍵然後我寫與

New-Item -path $SshKeysDir -Name $SshPrivateKeyFile -Value $SshPrivateKey -ItemType file -force 

這正常使用公鑰的newfile中。但出於某種奇怪的原因,它不適用於私鑰。新的文件只有

System.Object[] 

作爲一種變通方法我目前使用

$SshPrivateKey > $testpath 

其正確寫入文件結束。也寫作內容到控制檯呈現預期的私鑰

Write-Output $SshPrivateKey 

什麼最困擾我的是,它適用於其他文件,如公鑰或已知主機的事實。只是不用於私鑰文件。 的公鑰工作命令如下

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

一個區別我看到的是,公共密鑰是公開密鑰的情況下,多與單行。

任何人都可以點亮這個神祕的東西嗎?

+0

如果你正在用'Get-Content'來閱讀,你爲什麼不用'Set-Content'編寫它?如果意圖是複製文件,爲什麼不使用'Copy-Item'? – Remko

+0

感謝您的提示!我對Powershell非常陌生,並且我不瞭解Set-Content。只要輸入來自實際上可能在我的用例中更改的文件,Copy-Item就可能是一個很好的解決方案。 –

回答

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.這就是說,喜歡this answer到接受一個如果你正在運行3.0或更高版本。

+0

太棒了,那有效!我不覺得Get-Content可能是問題所在。 Powershell newbee ... –

相關問題