Модуль Posh-SSH простой доступ к SSH и SCP из PowerShell

    для powershell есть модуль Posh-SSH реализующий поддержку протоколов SSH, SFTP, SCP в PowerShell. Здесь описывается как установить, и базовые заметки по работе. По сути это выжимка из англоязычной статьи приведенной ниже.

    по определенному событию понадобилось сбрасывать сетевой порт на коммутаторе. Коммутатор имеет command line интерфейс cisco. Перед тем как использовать из командной строки putty было решено посмотреть существуют ли модули для работы по ssh напрямую из powershell. Поиски дали модуль Posh-SSH на github.

    Модуль позволяет:

    • устанавливать сессии SSH и SFTP по кредиталам или используя OpenSSH ключ
    • подключаться через SOCKS и HTTP прокси для обоих видов SSH и SFTP сессий
    • исполнять команды по одиночке посылая их в SSH
    • загружать и скачивать файлы использую SCP и SFTP протоколы

    Для SSH поддерживается аутентификация по ключу, логину\паролю, ввод с клавиатуры. Поддерживаются разные алгоритмы шифрования, поддерживаются прокси

    Минимальные требования — PowerShell 3.0 и .NET 4.0. Описание модуля на официальной страничке.

    Установка модуля


    Простейший способ установки из админской консоли запустить команду:

    iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")
    

    Если у вас стоит PowerShell 5:

    Find-Module Posh-SSH | Install-Module
    

    Просмотреть команды в модуле можно так:

    Get-Command -Module Posh-SSH
    

    Как работать с SSH


    1. Сначала создаем SSH сессию:

    Import-Module Posh-SSH
    $SSHSession = New-SSHSession -ComputerName 192.168.1.1 -Credential $(Get-Credential) -Verbose

    При первом подключении модуль спросит добавить ли удаленный хост в список доверенных. Можно сделать один раз запуск New-SSHSession из консоли и нажать Y. В последующем подключаться будет без вопросов.

    Доверенные хосты
    Для просмотра и удаления доверенных хостов используются командлеты

    • Get-SSHTrustedHost
    • Get-SSHSession
    • Remove-SSHSession


    2. Создаем шелл:

    $SSH = $SSHSession | New-SSHShellStream

    Все, теперь можно посылать команды и считывать ответ:

    # отправляет команду
    $SSH.WriteLine( "enable" )
    
    # считываем ответ
    $SSH.read()
    

    3. Завершение работы:

    $sshSession | Remove-SSHSession
    

    Просмотреть сессии можно командой Get-SSHSession.

    Ниже пример работы:

    • подключаемся по SSH
    • переходим в enable режим
    • переходим в режим конфигурации интерфейса
    • ресетим интерфейс

    Пример работы с коммутатором по SSH
    $SwitchIP = '10.10.3.2'
    $SwitchPort = 4
    
    $Cred = Get-Credential admin
    $SSHSession = New-SSHSession -ComputerName $SwitchIP -Credential $Cred -Verbose
    
    if ($($sshSession.Connected) -eq $true) {
        Write-Host "SSH session opened" -ForegroundColor Green
        
        Write-Host " "
        Write-Host "     open shell" -ForegroundColor Green
        ### сессия открыта успешно, начинаем сброс порта
        $ssh = $sshSession | New-SSHShellStream
        Start-Sleep -Seconds 1
    
        # ресетим интерфейс
        $ssh.read()
    
        Start-Sleep -Seconds 1
        $ssh.WriteLine( "enable" )
        $ssh.read()
        Write-Host "     переходим в привелигированный режим" -ForegroundColor Green
    
        Start-Sleep -Seconds 1
        $ssh.WriteLine( "password" )
        $ssh.read()
        Write-Host "     вводим пароль" -ForegroundColor Green
    
        Start-Sleep -Seconds 1
        $ssh.WriteLine( "configure" )
        $ssh.read()
        Write-Host "     переходим в режим конфигурации" -ForegroundColor Green
    
        Start-Sleep -Seconds 1
        $ssh.WriteLine( "interface gigabitEthernet 1/0/$SwitchPort" )
        $ssh.read()
        Write-Host "     переходим к конфигурации интерфейса    interface gigabitEthernet 1/0/$SwitchPort" -ForegroundColor Green
    
        Start-Sleep -Seconds 1
        $ssh.WriteLine( "shutdown" )
        $ssh.read()
        Write-Host "     отключаем интерфейс" -ForegroundColor Green
    
        Start-Sleep -Seconds 3
        $ssh.WriteLine( "no shutdown" )
        $ssh.read()
        Write-Host "     включаем интерфейс" -ForegroundColor Green
    
        Write-Host "     отработали, завершаемся" -ForegroundColor Green
    }
    else {
        Write-Host "SSH session cannot be established" -ForegroundColor Red
        Write-Host "script terminate" -ForegroundColor Red
        exit
    }
    
    
    if ( $($sshSession | Remove-SSHSession) -eq $true) {
        Write-Host "SSH session closed" -ForegroundColor Green
    }
    else{
        Write-Host "SSH session NOT closed" -ForegroundColor Red
        Write-Host "please check manual" -ForegroundColor Red
        
        Get-SSHSession
    }
    

    Как видно из примера можно получать обратно вывод консоли и парсить при необходимости
    метода отправки 2 — Write и WriteLine первый печатает в консоль, второй соответственно печатает и нажимает Enter.

    Передача файлов по SCP


    Тут все еще проще. привожу пример с официальной страницы. Закачка файла:

    Set-SCPFile -LocalFile .\Downloads\VMware-PowerCLI-5.5.0-1671586.exe -RemoteFile "/tmp/powercliinstaller.exe" -ComputerName 192.168.10.3 -Credential (Get-Credential root)

    Скачивание файла:

    Get-SCPFile -LocalFile .\Downloads\VMware-PowerCLI.exe -RemoteFile "/tmp/powercliinstaller.exe" -ComputerName 192.168.10.3 -Credential (Get-Credential root)

    » Официальная страничка от создателя модуля

    Полезные ссылки: раз и два.
    • +9
    • 21.8k
    • 1
    Share post

    Comments 1

      0
      Как вариант можете рассмотреть msys/mingw или отдельно, или в составе git-scm (https://git-scm.com/).
      Плюсы в том что полноценная оболочка bash, родной ssh клиент, потому проблем с совместимостю не наблюдается.

      Only users with full accounts can post comments. Log in, please.