开源Granados介绍 - SSH连接远程Linux服务器(C#)

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 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.好的,现在来测试一下:

    {

        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.如果你需要快速的执行某些指定的命令,则可以把上面的

  while (true)

{

      int input = System.Console.Read();

      b[0= (byte)input;

      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/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。