SSH Client (PowerShell)

From vwiki
Revision as of 13:31, 18 April 2012 by Sstrutt (talk | contribs) (Initial creation - content from PowerShell Examples page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Tamir Gal SharpSSH

There are a number of examples of using PowerShell to act as a client to interact with SSH servers, all that I've found using Tamir Gal's SharpSSH .NET library - eg PoSh 1010. Its a port of a Java implementation and whilst some people have obviously had success in using it, I always seemed to get the following error when trying to write to SSH session with a Vyatta router...

# ChannelSession.run
System.IO.IOException: Write end dead
  at Tamir.Streams.PipedInputStream.read()
  at Tamir.Streams.PipedInputStream.read(Byte[] b, Int32 off, Int32 len)
  at Tamir.Streams.PipedInputStream.Read(Byte[] buffer, Int32 offset, Int32 count)
  at Tamir.SharpSsh.java.io.JStream.Read(Byte[] buffer, Int32 offset, Int32 count)
  at Tamir.SharpSsh.jsch.ChannelSession.run()

I suspect the Write end dead fault is caused by the SSH server throwing an error and closing the socket, due to an disliked command. Which in a way, is fair enough, but its not a particularly graceful way of handling things.

Renci SSH.NET

Renci SSH.NET is an ongoing project, still in beta, but already provides a workable solution. Providing both .NET 4.0 and 3.5 libraries (you need 3.5 for PowerShell v2).

To get running you need to download the binary DLL file from http://sshnet.codeplex.com/releases/view/72214, and put it in a place where you can load the assembly into your PowerShell session, eg

[void][reflection.assembly]::LoadFrom( (Resolve-Path ".\lib\RenciSSH\Renci.SshNet.dll") )      # DLL file is in \lib\RenciSSH\ below calling script

Create a SSH Client object, and connect...

$SshClient = New-Object Renci.SshNet.SshClient("ssh-server", 22, "user", "password")
$SshClient.Connect()

Run a command (eg a Unix ifconfig against the server...

if ($SshClient.IsConnected) {
    $SshCommand = $SshClient.RunCommand("ifconfig")
    $ifconfig = $SshCommand.Result.Split("`n")
}

Clear down...

$SshCommand.Dispose()
$SshClient.Disconnect()
$SshClient.Dispose()