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.txtn";
 
byte[] data = (new UnicodeEncoding()).GetBytes(cmd);
 reader._pf.Transmit(data);

希望当你在找一个SSH库时这篇文章对你有所帮助,谢谢!

作者:CoderZhCoderZh的技术博客 - 博客园
微博:http://t.sina.com.cn/coderzh 
出处:http://coderzh.cnblogs.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()