• 开源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.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);

    希望当你在找一个SSH库时这篇文章对你有所帮助,谢谢!
  • 相关阅读:
    ①---Java开发环境配置
    1.java的基础和数据类型
    0、原生jdbc工厂类
    spring中使用quartz动态添加定时任务执行sql
    app前端代码打包步骤
    less的解析笔记
    转:玩转HTML5移动页面(动效篇)
    HTML5属性备忘单
    玩转git和github
    js基础----数组
  • 原文地址:https://www.cnblogs.com/coderzh/p/1203574.html
Copyright © 2020-2023  润新知