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);
發佈了94 篇原創文章 · 獲贊 2 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章