Я хотел сделать это уже несколько месяцев. Сегодня днем, чтобы отложить немного более сложную задачу в моем списке дел на отпуск, я наконец нашел время и создал этот модуль PowerShell.
Он довольно прост, но поддерживает мои катры для управления чистыми конфигурационными файлами.
!!!DISCLAIMER!!! никаких гарантий — пожалуйста, тщательно проверьте поведение этого скрипта в вашей среде и регулярно делайте резервные копии.
- Как использовать модуль
- a — считать список настроенных хостов в HashTable
- b — добавить новую запись в этот список хостов
- c — обновление существующей записи в этом списке хостов
- d — удалить существующую запись из этого списка хостов
- e — а затем записать этот список обратно на диск
- Особенности
- Разрывы строк
- Ключевые слова
- JSON
Как использовать модуль
После импорта модуля
Import-Module .ManageSshConfig.psm1
он позволяет
a — считать список настроенных хостов в HashTable
$hostList = Get-ConfigHostList
b — добавить новую запись в этот список хостов
$hostList = Add-ConfigHostInList -HostList $hostList -HostName "dummy" -HostValues @{
identityfile = "~/.ssh/myprivatekey"
hostname = "dummy.somecloud.com"
user = "johndoe"
}
c — обновление существующей записи в этом списке хостов
$hostList = Update-ConfigHostInList -HostList $hostList -HostName "dummy" -HostValues @{
identityfile = "~/.ssh/myprivatekey"
hostname = "dummy.somecloud.com"
user = "johndoe"
}
d — удалить существующую запись из этого списка хостов
$hostList = Remove-ConfigHostFromList -HostList $hostList -HostName "dummy"
e — а затем записать этот список обратно на диск
Set-ConfigHostList $hostList
Особенности
Разрывы строк
Скрипт должен уметь определять разрывы строк, используемые в файле config
. Это может быть CR/LF в Windows и определенно LF в Linux, macOS & аналогично.
Если это кажется вам незнакомым, ознакомьтесь с хорошим объяснением Скотта Хансельмана на эту тему.
На моей машине Windows я заставил Visual Studio Code всегда сохранять окончания строк с LF — просто чтобы быть в безопасности при копировании этого файла туда и обратно между различными платформами ОС.
Ключевые слова
Ключевые слова типа IdentityFile
или HostName
согласовываются при
- чтении из файла
config
в HashTable - добавление или обновление записей
в соответствии с нотацией, обычно встречающейся в документации, например.
JSON
После загрузки списка хостов его также можно преобразовать в JSON:
$hostList = Get-ConfigHostList
$hostList | ConvertTo-Json
{
"dummy": {
"User": "johndoe",
"HostName": "dummy.somecloud.com",
"IdentityFile": "~/.ssh/myprivatekey"
}
}
Это даже позволяет экспортировать SSH-конфиг в JSON-файл, управлять им в этом формате и затем импортировать его обратно:
$hostList = Get-ConfigHostList
$hostList | ConvertTo-Json -AsHashtable | Set-Content "ssh-config.json"
... do your magic here ...
$hostList = Get-Content "ssh-config.json" | ConvertFrom-Json -AsHashtable
Set-ConfigHostList $hostList