转载自:http://blog.csdn.net/lusonglin3g/article/details/4801247
Granados是一个基于.NET的SSH客户端库。它有以下特点: 1.Granados是一个C#的开源项目。源码地址:http://www.routrek.co.jp/support/download/varaterm/granados200.tar.gz 2.同时支持SSH1和SSH2。 3.Granados实现了AES, Blowfish, TripleDES, RSA, DSA等加密验证算法。 4.实现TCP协议连接。
如何使用Granados库
可惜的是Granados的文档几乎没有!所以只有从它的源码找到它的测试代码来看。总结步骤为: 1.工程中添加Routrek.granados.dll(下载的包里有)的引用。 2.添加Reader类,实现ISSHConnectionEventReceiver和ISSHChannelEventReceiver接口。首先引用命名空间:
using
System.Threading;
using
System.Diagnostics;
using
System.Net;
using
System.Net.Sockets;
using
Routrek.Crypto;
using
Routrek.SSHC;
using
Routrek.SSHCV1;
using
Routrek.SSHCV2;
using
Routrek.Toolkit;
using
Routrek.PKI;
Reader类实现如下:
class
Reader : ISSHConnectionEventReceiver, ISSHChannelEventReceiver
{ public SSHConnection _conn; public bool _ready; public void OnData( byte [] data, int offset, int length) { System.Console.Write(Encoding.ASCII.GetString(data, offset, length)); } public void OnDebugMessage( bool always_display, byte [] data) { Debug.WriteLine( " DEBUG: " + Encoding.ASCII.GetString(data)); } public void OnIgnoreMessage( byte [] data) { Debug.WriteLine( " Ignore: " + Encoding.ASCII.GetString(data)); } public void OnAuthenticationPrompt( string [] msg) { Debug.WriteLine( " Auth Prompt " + msg[ 0 ]); } public void OnError(Exception error, string msg) { Debug.WriteLine( " ERROR: " + msg); } public void OnChannelClosed() { Debug.WriteLine( " Channel closed " ); _conn.Disconnect( "" ); // _conn.AsyncReceive(this); } public void OnChannelEOF() { _pf.Close(); Debug.WriteLine( " Channel EOF " ); } public void OnExtendedData( int type, byte [] data) { Debug.WriteLine( " EXTENDED DATA " ); } public void OnConnectionClosed() { Debug.WriteLine( " Connection closed " ); } public void OnUnknownMessage( byte type, byte [] data) { Debug.WriteLine( " Unknown Message " + type); } public void OnChannelReady() { _ready = true ; } public void OnChannelError(Exception error, string msg) { Debug.WriteLine( " Channel ERROR: " + msg); } public void OnMiscPacket( byte type, byte [] data, int offset, int length) { } public PortForwardingCheckResult CheckPortForwardingRequest( string host, int port, string originator_host, int originator_port) { PortForwardingCheckResult r = new PortForwardingCheckResult(); r.allowed = true ; r.channel = this ; return r; } public void EstablishPortforwarding(ISSHChannelEventReceiver rec, SSHChannel channel) { _pf = channel; } public SSHChannel _pf; }
3.好的,现在来测试一下:
class
Program
{ private static SSHConnection _conn; static void Main( string [] args) { SSHConnectionParameter f = new SSHConnectionParameter(); f.UserName = " root " ; f.Password = " **** " ; f.Protocol = SSHProtocol.SSH2; f.AuthenticationType = AuthenticationType.Password; f.WindowSize = 0x1000 ; Reader reader = new Reader(); Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); s.Connect( new IPEndPoint(IPAddress.Parse( " 192.168.x.x " ), 22 )); _conn = SSHConnection.Connect(f, reader, s); reader._conn = _conn; SSHChannel ch = _conn.OpenShell(reader); reader._pf = ch; SSHConnectionInfo ci = _conn.ConnectionInfo; Thread.Sleep( 1000 ); byte [] b = new byte [ 1 ]; while ( true ) { int input = System.Console.Read(); b[ 0 ] = ( byte )input; reader._pf.Transmit(b); } } }
4.执行效果如下: 5.如果你需要快速的执行某些指定的命令,则可以把上面的
byte
[] b
=
new
byte
[
1
];
while
(
true
)
{ int input = System.Console.Read(); b[ 0 ] = ( byte )input; reader._pf.Transmit(b); }
替换为:
string
cmd
=
"
vi xxx.txt/n
"
;
byte
[] data
=
(
new
UnicodeEncoding()).GetBytes(cmd); reader._pf.Transmit(data);
转载于:https://blog.51cto.com/waterland/1203987