PowerShell
April 27, 2023

Автодополнение для команд ssh, scp, и sftp в PowerShell

Этот код PowerShell регистрирует автодополнение для команд `ssh`, `scp`, и `sftp`. Он использует файл конфигурации SSH для получения списка хостов и предлагает их в качестве вариантов автодополнения при вводе этих команд.

Код

Register-ArgumentCompleter -CommandName ssh,scp,sftp -Native -ScriptBlock {
	param($wordToComplete, $commandAst, $cursorPosition)
	$sshConfigFile = "$env:USERPROFILE\.ssh\config"
    if (Test-Path $sshConfigFile) {
        Get-Content $sshConfigFile | Where-Object {$_ -match "^Host" -and $_.Split()[1] -like "$wordToComplete*"} | ForEach-Object {$_.Split()[1]} | Sort-Object -Unique | ForEach-Object {
            [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
        }
    } else {
        return @()
    }
}

Установка

  1. Скопируйте код
  2. Откройте PowerShell и запустите команду notepad $profile.
  3. Вставьте код в открывшийся файл
  4. Перезапустите PowerShell
  5. Теперь, когда вы начинаете вводить команды `ssh`, `scp`, или `sftp`, PowerShell будет предлагать вам список доступных хостов из файла конфигурации SSH для автодополнения.

Как это работает

Когда вы начинаете вводить команду ssh, scp, или sftp в PowerShell, автодополнение вызывает функцию $s, которая использует файл конфигурации SSH для получения списка хостов, начинающихся с того, что вы уже ввели. Затем функция создает массив объектов `[System.Management.Automation.CompletionResult]` для каждого хоста и возвращает его.

Зарегистрировав эту функцию в качестве автодополнителя для команд `ssh`, `scp`, и `sftp` с помощью команды `Register-ArgumentCompleter`, PowerShell будет использовать ее для предложения вариантов автодополнения при вводе этих команд.

Описание файла конфигурации SSH

Файл конфигурации SSH находится в директории `$env:USERPROFILE\.ssh\config` и используется для определения параметров подключения к хостам. Каждый хост определяется с помощью блока, начинающегося со слова `Host`, за которым

Host example.com
    Hostname 192.0.2.1
    User john

В этом примере `example.com` - это имя хоста, а `192.0.2.1` и `john` - параметры подключения.