SSH Client (PowerShell)
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()