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.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类实现如下:

 
     {
{
 public SSHConnection _conn;
        public SSHConnection _conn;
 public bool _ready;
        public bool _ready;

 public void OnData(byte[] data, int offset, int length)
        public void OnData(byte[] data, int offset, int length)

 
         {
{
 System.Console.Write(Encoding.ASCII.GetString(data, offset, length));
            System.Console.Write(Encoding.ASCII.GetString(data, offset, length));
 }
        }
 public void OnDebugMessage(bool always_display, byte[] data)
        public void OnDebugMessage(bool always_display, byte[] data)

 
         {
{
 Debug.WriteLine("DEBUG: " + Encoding.ASCII.GetString(data));
            Debug.WriteLine("DEBUG: " + Encoding.ASCII.GetString(data));
 }
        }
 public void OnIgnoreMessage(byte[] data)
        public void OnIgnoreMessage(byte[] data)

 
         {
{
 Debug.WriteLine("Ignore: " + Encoding.ASCII.GetString(data));
            Debug.WriteLine("Ignore: " + Encoding.ASCII.GetString(data));
 }
        }
 public void OnAuthenticationPrompt(string[] msg)
        public void OnAuthenticationPrompt(string[] msg)

 
         {
{
 Debug.WriteLine("Auth Prompt " + msg[0]);
            Debug.WriteLine("Auth Prompt " + msg[0]);
 }
        }

 public void OnError(Exception error, string msg)
        public void OnError(Exception error, string msg)

 
         {
{
 Debug.WriteLine("ERROR: " + msg);
            Debug.WriteLine("ERROR: " + msg);
 }
        }
 public void OnChannelClosed()
        public void OnChannelClosed()

 
         {
{
 Debug.WriteLine("Channel closed");
            Debug.WriteLine("Channel closed");
 _conn.Disconnect("“);
            _conn.Disconnect("“);
 //_conn.AsyncReceive(this);
            //_conn.AsyncReceive(this);
 }
        }
 public void OnChannelEOF()
        public void OnChannelEOF()

 
         {
{
 _pf.Close();
            _pf.Close();
 Debug.WriteLine("Channel EOF");
            Debug.WriteLine("Channel EOF");
 }
        }
 public void OnExtendedData(int type, byte[] data)
        public void OnExtendedData(int type, byte[] data)

 
         {
{
 Debug.WriteLine("EXTENDED DATA");
            Debug.WriteLine("EXTENDED DATA");
 }
        }
 public void OnConnectionClosed()
        public void OnConnectionClosed()

 
         {
{
 Debug.WriteLine("Connection closed");
            Debug.WriteLine("Connection closed");
 }
        }
 public void OnUnknownMessage(byte type, byte[] data)
        public void OnUnknownMessage(byte type, byte[] data)

 
         {
{
 Debug.WriteLine("Unknown Message " + type);
            Debug.WriteLine("Unknown Message " + type);
 }
        }
 public void OnChannelReady()
        public void OnChannelReady()

 
         {
{
 _ready = true;
            _ready = true;
 }
        }
 public void OnChannelError(Exception error, string msg)
        public void OnChannelError(Exception error, string msg)

 
         {
{
 Debug.WriteLine("Channel ERROR: " + msg);
            Debug.WriteLine("Channel ERROR: " + msg);
 }
        }
 public void OnMiscPacket(byte type, byte[] data, int offset, int length)
        public void OnMiscPacket(byte type, byte[] data, int offset, int length)

 
         {
{
 }
        }

 public PortForwardingCheckResult CheckPortForwardingRequest(string host, int port, string originator_host, int originator_port)
        public PortForwardingCheckResult CheckPortForwardingRequest(string host, int port, string originator_host, int originator_port)

 
         {
{
 PortForwardingCheckResult r = new PortForwardingCheckResult();
            PortForwardingCheckResult r = new PortForwardingCheckResult();
 r.allowed = true;
            r.allowed = true;
 r.channel = this;
            r.channel = this;
 return r;
            return r;
 }
        }
 public void EstablishPortforwarding(ISSHChannelEventReceiver rec, SSHChannel channel)
        public void EstablishPortforwarding(ISSHChannelEventReceiver rec, SSHChannel channel)

 
         {
{
 _pf = channel;
            _pf = channel;
 }
        }

 public SSHChannel _pf;
        public SSHChannel _pf;
 }
    }
3.好的,现在来测试一下:

 
     {
{
 private static SSHConnection _conn;
        private static SSHConnection _conn;
 static void Main(string[] args)
        static void Main(string[] args)

 
         {
{
 SSHConnectionParameter f = new SSHConnectionParameter();
            SSHConnectionParameter f = new SSHConnectionParameter();
 f.UserName = "root";
            f.UserName = "root";
 f.Password = "****";
            f.Password = "****";
 f.Protocol = SSHProtocol.SSH2;
            f.Protocol = SSHProtocol.SSH2;
 f.AuthenticationType = AuthenticationType.Password;
            f.AuthenticationType = AuthenticationType.Password;
 f.WindowSize = 0x1000;
            f.WindowSize = 0x1000;
 Reader reader = new Reader();
            Reader reader = new Reader();
 Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 s.Connect(new IPEndPoint(IPAddress.Parse("192.168.x.x"), 22));
            s.Connect(new IPEndPoint(IPAddress.Parse("192.168.x.x"), 22));
 _conn = SSHConnection.Connect(f, reader, s);
            _conn = SSHConnection.Connect(f, reader, s);
 reader._conn = _conn;
            reader._conn = _conn;
 SSHChannel ch = _conn.OpenShell(reader);
            SSHChannel ch = _conn.OpenShell(reader);
 reader._pf = ch;
            reader._pf = ch;
 SSHConnectionInfo ci = _conn.ConnectionInfo;
            SSHConnectionInfo ci = _conn.ConnectionInfo;

 Thread.Sleep(1000);
            Thread.Sleep(1000);
 
            
 byte[] b = new byte[1];
            byte[] b = new byte[1];
 while (true)
            while (true)

 
             {
{
 int input = System.Console.Read();
                int input = System.Console.Read();
 b[0] = (byte)input;
                b[0] = (byte)input;
 reader._pf.Transmit(b);
                reader._pf.Transmit(b);
 }
            }

 }
        }
 }
    }
4.执行效果如下:
5.如果你需要快速的执行某些指定的命令,则可以把上面的
while (true)

 {
{
 int input = System.Console.Read();
      int input = System.Console.Read();
 b[0] = (byte)input;
      b[0] = (byte)input;
 reader._pf.Transmit(b);
      reader._pf.Transmit(b);
 }
 }
替换为:
byte[] data = (new UnicodeEncoding()).GetBytes(cmd);
reader._pf.Transmit(data);
希望当你在找一个SSH库时这篇文章对你有所帮助,谢谢!
[温馨提示]:该文章由原博客园导入而来,如排版效果不佳,请移步:http://www.cnblogs.com/coderzh/archive/2008/05/20/1203574.html
 
                        作者:CoderZh
                            
微信关注:hacker-thinking (代码随想)
                            
本文出处:https://blog.coderzh.com/2008/05/20/1203574/
                            
                            文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。