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



本文转自CoderZh博客园博客,原文链接:http://www.cnblogs.com/coderzh/archive/2008/05/20/1203574.html,如需转载请自行联系原作者

目录
相关文章
|
25天前
|
弹性计算 安全 Linux
阿里云服务器ECS安装宝塔Linux面板、安装网站(新手图文教程)
本教程详解如何在阿里云服务器上安装宝塔Linux面板,涵盖ECS服务器手动安装步骤,包括系统准备、远程连接、安装命令执行、端口开放及LNMP环境部署,手把手引导用户快速搭建网站环境。
|
2月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
284 13
|
2月前
|
监控 Linux 网络安全
FinalShell SSH工具下载,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux
FinalShell是一款国人开发的多平台SSH客户端工具,支持Windows、Mac OS X和Linux系统。它提供一体化服务器管理功能,支持shell和sftp同屏显示,命令自动提示,操作便捷。软件还具备加速功能,提升访问服务器速度,适合普通用户和专业人士使用。
183 0
|
2月前
|
存储 安全 Linux
Linux服务器上安装配置GitLab的步骤。
按照以上步骤,一个基础的GitLab服务应该运行并可以使用。记得定期检查GitLab官方文档,因为GitLab的安装和配置步骤可能随着新版本而变化。
220 0
|
5月前
|
安全 Linux
阿里云linux服务器使用脚本通过安全组屏蔽异常海外访问ip
公网网站可能会遭受黑客攻击导致访问异常,使用此脚本可以屏蔽掉异常IP 恢复访问。也可自行设置定时任务定期检测屏蔽。
423 28
|
6月前
|
存储 运维 监控
深度体验阿里云系统控制台:SysOM 让 Linux 服务器监控变得如此简单
作为一名经历过无数个凌晨三点被服务器报警电话惊醒的运维工程师,我对监控工具有着近乎苛刻的要求。记得去年那次大型活动,我们的主站流量暴增,服务器内存莫名其妙地飙升到90%以上,却找不到原因。如果当时有一款像阿里云 SysOM 这样直观的监控工具,也许我就不用熬通宵排查问题了。今天,我想分享一下我使用 SysOM 的亲身体验,特别是它那令人印象深刻的内存诊断功能。
180 1
|
10月前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
11月前
|
弹性计算 Linux 数据库
阿里云国际版如何迁移Linux云服务器系统盘中的数据
阿里云国际版如何迁移Linux云服务器系统盘中的数据
|
11月前
|
弹性计算 网络协议 Ubuntu
如何在阿里云国际版Linux云服务器中自定义配置DNS
如何在阿里云国际版Linux云服务器中自定义配置DNS