SSH Client (PowerShell): Difference between revisions
(→Renci SSH.NET: Some rewording, and added .NET not installed error) |
(Added "Download File") |
||
Line 15: | Line 15: | ||
[http://sshnet.codeplex.com/ Renci SSH.NET] is an ongoing project, its still in beta, but already provides a workable solution with all the core features you're likely to want. Plus as its in active development there's high chance that any probs you might have would be promptly worked on. It provides both .NET 4.0 and 3.5 libraries, '''you need to use the .NET 3.5 library for PowerShell v2'''. | [http://sshnet.codeplex.com/ Renci SSH.NET] is an ongoing project, its still in beta, but already provides a workable solution with all the core features you're likely to want. Plus as its in active development there's high chance that any probs you might have would be promptly worked on. It provides both .NET 4.0 and 3.5 libraries, '''you need to use the .NET 3.5 library 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 | 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 (the DLL file) into your PowerShell session, eg | ||
<source lang="powershell"> | <source lang="powershell"> | ||
Line 22: | Line 22: | ||
If you don't have .NET 3.5 installed, you'll need to do so from https://www.microsoft.com/download/en/details.aspx?displaylang=en&id=21 (the main installer is just a downloader/bootstrapper, there's a full fat install package link at the bottom of the page). | If you don't have .NET 3.5 installed, you'll need to do so from https://www.microsoft.com/download/en/details.aspx?displaylang=en&id=21 (the main installer is just a downloader/bootstrapper, there's a full fat install package link at the bottom of the page). | ||
=== Simple Command === | |||
Whilst this is a very simplistic example, involving connecting to a device/server and running the <code>ifconfig</code> command (Unix equivalent of <code>ipconfig</code>; it does open the door to more involved usage where you can run a command, parse the result, then run further commands based on the response. | |||
'''Create a SSH Client object, and connect...''' | '''Create a SSH Client object, and connect...''' | ||
Line 32: | Line 35: | ||
* <code>Could not load file or assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.</code> | * <code>Could not load file or assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.</code> | ||
'''Run a command (eg a Unix <code>ifconfig</code> against the server...''' | '''Run a command (eg a Unix <code>ifconfig</code>) against the server...''' | ||
<source lang="powershell"> | <source lang="powershell"> | ||
if ($SshClient.IsConnected) { | if ($SshClient.IsConnected) { | ||
$SshCommand = $SshClient.RunCommand("ifconfig") | $SshCommand = $SshClient.RunCommand("ifconfig") # Result of 'ifconfig' is returned to $SshCommand | ||
$ifconfig = $SshCommand.Result.Split("`n") | $ifconfig = $SshCommand.Result.Split("`n") # Split up the result into individual lines for easier parsing | ||
} | } | ||
</source> | </source> | ||
Line 46: | Line 49: | ||
$SshClient.Dispose() | $SshClient.Dispose() | ||
</source> | </source> | ||
=== Download File === | |||
Simple example showing how to use PowerShell to open up a [[Acronyms#S|SFTP]] connection to a server, and download a file. | |||
'''Create a SFTP Client object, and connect...''' | |||
<source lang="powershell"> | |||
$ConnInfo = New-Object Renci.SshNet.PasswordConnectionInfo("ssh-server", 22, "user", "pass") | |||
$SftpClient = New-Object Renci.SshNet.SftpClient($ConnInfo) | |||
$SftpClient.Connect() | |||
</source> | |||
'''Create an IO stream to local file''' | |||
<source lang="powershell"> | |||
$RxFile = "c:\temp\download.txt" | |||
$RxFileStream = [System.IO.File]::Create($RxFile) | |||
</source> | |||
'''Download file''', in this case, an [[:Category:Apache|Apache]] log file | |||
<source lang="powershell"> | |||
$SftpClient.DownloadFile("/var/log/apache2/access.log", $RxFileStream) # Download file contents to stream | |||
$RxFileStream.Flush() # Flush contents through | |||
$RxFileStream.Close() # Write to file and close stream | |||
</source> | |||
'''Clear down...''' | |||
<source lang="powershell"> | |||
$RxFileStream.Dispose() | |||
$SftpClient.Disconnect() | |||
$SftpClient.Dispose() | |||
</source> | |||
[[Category:PowerShell]] | [[Category:PowerShell]] | ||
[[Category:SSH]] | [[Category:SSH]] |
Revision as of 13:00, 24 April 2012
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, its still in beta, but already provides a workable solution with all the core features you're likely to want. Plus as its in active development there's high chance that any probs you might have would be promptly worked on. It provides both .NET 4.0 and 3.5 libraries, you need to use the .NET 3.5 library 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 (the DLL file) into your PowerShell session, eg
[void][reflection.assembly]::LoadFrom( (Resolve-Path ".\lib\RenciSSH\Renci.SshNet.dll") ) # DLL file is in \lib\RenciSSH\ folder below the calling script
If you don't have .NET 3.5 installed, you'll need to do so from https://www.microsoft.com/download/en/details.aspx?displaylang=en&id=21 (the main installer is just a downloader/bootstrapper, there's a full fat install package link at the bottom of the page).
Simple Command
Whilst this is a very simplistic example, involving connecting to a device/server and running the ifconfig
command (Unix equivalent of ipconfig
; it does open the door to more involved usage where you can run a command, parse the result, then run further commands based on the response.
Create a SSH Client object, and connect...
$SshClient = New-Object Renci.SshNet.SshClient("ssh-server", 22, "user", "password")
$SshClient.Connect()
If the connect fails with the following error - you need to install .NET 3.5 (the SSH library is trying to use components that don't exist).
Could not load file or assembly 'System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified.
Run a command (eg a Unix ifconfig
) against the server...
if ($SshClient.IsConnected) {
$SshCommand = $SshClient.RunCommand("ifconfig") # Result of 'ifconfig' is returned to $SshCommand
$ifconfig = $SshCommand.Result.Split("`n") # Split up the result into individual lines for easier parsing
}
Clear down...
$SshCommand.Dispose()
$SshClient.Disconnect()
$SshClient.Dispose()
Download File
Simple example showing how to use PowerShell to open up a SFTP connection to a server, and download a file.
Create a SFTP Client object, and connect...
$ConnInfo = New-Object Renci.SshNet.PasswordConnectionInfo("ssh-server", 22, "user", "pass")
$SftpClient = New-Object Renci.SshNet.SftpClient($ConnInfo)
$SftpClient.Connect()
Create an IO stream to local file
$RxFile = "c:\temp\download.txt"
$RxFileStream = [System.IO.File]::Create($RxFile)
Download file, in this case, an Apache log file
$SftpClient.DownloadFile("/var/log/apache2/access.log", $RxFileStream) # Download file contents to stream
$RxFileStream.Flush() # Flush contents through
$RxFileStream.Close() # Write to file and close stream
Clear down...
$RxFileStream.Dispose()
$SftpClient.Disconnect()
$SftpClient.Dispose()