11 November 2016

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

System administrationPowerShell
для 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)

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

Полезные ссылки: раз и два.
Tags:powershellssh
Hubs: System administration PowerShell
+9
28.9k 79
Comments 1