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库时这篇文章对你有所帮助,谢谢!

转载于:https://www.cnblogs.com/coderzh/archive/2008/05/20/1203574.html

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

  1. Mac下使用SSH连接远程Linux服务器

    本文主要介绍三种方法,在Mac下使用SSH连接远程Linux服务器. 方法一:使用终端 1.打开终端,点击新建远程连接 2.点击加号,然后添加自己服务器的IP地址 3.点击右侧的服务器,然后在下方输入 ...

  2. 在IDEA中通过密钥认证的方式使用SSH连接远程Linux服务器

    引入 如图,其中Password是通过密码的方式,即你只需要知道远程服务器指定用户的登录密码,你可以连接它:而Key pair则是通过密钥的方式,即你需要在本地服务器上生成公钥证书,然后上传到指定的远 ...

  3. Mac下如何用SSH连接远程Linux服务器

    有两个方法,下面我来一一贡献给大家 1.终端命令 a).打开Mac的命令终端 b).输入ssh -p 22 root@101.xxx.xx.xxx(ip) 它会提示你输入密码,输入正确的密码之后,你就 ...

  4. VisualGDB使用SSH连接远程Linux服务器运行调试Linux工程

    官方教程:Importing CMake Linux projects to VisualGDB

  5. 使用PuTTY连接远程Linux服务器

    PuTTY软件 putty 简介 简单的说 putty 是一个开源程序,用来连接服务器.最早的时候,仅仅在window系统上可以使用,后来在其他的系统上也可以运行,比如 类unix, mac .put ...

  6. linux 如何连接远程,如何连接远程LINUX服务器

    如何连接远程LINUX服务器 你好.ssh以. 先要确保linux服务器上的sshd服务是运,查看sshd服务状态:/etc/init.d/sshd status,是running状态就行: 然后要确 ...

  7. jupyternotebook虚拟环境无法连接服务_详解pycharm连接远程linux服务器的虚拟环境的方法_python...

    这篇文章主要介绍了pycharm连接远程linux服务器的虚拟环境的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 一.前提条件 ...

  8. 利用VSCode集成并连接远程Linux服务器上的Docker

    利用VSCode集成并连接远程服务器Docker 为什么要使用VSCode管理docker 为什么要使用VSCode管理docker 官网地址:https://code.visualstudio.co ...

  9. 使用VS code 连接远程linux服务器 —— VSCODE clangd插件 |CSDN创作打卡

    文章目录 连接远程linux服务器 安装OpenSSH 确认VScode SSH是否打开 SSH设置 连接服务器 关闭远程连接 VSCODE clangd插件 在远程服务器安装bear Add Ite ...

最新文章

  1. 深蓝学院第三章:基于卷积神经网络(CNN)的手写数字识别实践
  2. Linux NUMA 架构 :基础软件工程师需要知道一些知识
  3. 成员函数和成员变量分开存储
  4. 新RSS reader
  5. 异步爬虫-aiohttp库、Twisted库简介
  6. Mac下VirtualBox虚拟机Win7与主机共享文件夹
  7. qwebkit 网页无法加载图片_网页图片无法显示了?这样就能解决
  8. 用pyqt5做一个能python程序能插入图片的ide
  9. linux下安装tuxedo
  10. 和我一起打造个简单搜索之ElasticSearch入门
  11. python:关于三级菜单的新手实现
  12. 《Involution:Inverting the Inherence of Convolution for Visual Recognition》论文笔记
  13. PyTorch学习(二):Transform
  14. jni--‘jni_internal.cc:616] JNI FatalError called,RegisterNatives failed,导致system_server crash
  15. Wing IDE中文乱码问题
  16. systemctl status network.service命令,Failed to start LSB: Bring up/down networking.完美解决
  17. 618最强攻略揭秘:成为网易考拉的黑卡会员!
  18. 吴恩达-目标检测讲解笔记
  19. 成都java开发学习要多久
  20. python中cv是什么_python里面cv是什么意思

热门文章

  1. Lua1.0 代码分析 opcode.c
  2. jsp和mysql乱码
  3. 网络编程C#篇(二):Socket无连接简单实例
  4. React 第五章 state 组件生命周期
  5. 区分 Protobuf 中缺失值和默认值
  6. ios端input 光标问题
  7. 解决自定义actionbar 两边空隙
  8. 局域网设备与公网服务之间如何交互数据?
  9. python3openpyxl,python3和openpyxl,在写入fi时格式化日期列表
  10. 实战系列-HashMap深入剖析