модуль 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)

официальная страничка от создателя модуля
www.powershellmagazine.com/2014/07/03/posh-ssh-open-source-ssh-powershell-module

полезные ссылки
www.powershelladmin.com/wiki/SSH_from_PowerShell_using_the_SSH.NET_library
blogs.msdn.microsoft.com/powershell/2015/06/03/looking-forward-microsoft-support-for-secure-shell-ssh
ссылка на оригинал статьи https://habrahabr.ru/post/314990/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *