221 lines
5.1 KiB
C#
221 lines
5.1 KiB
C#
using System.IO;
|
||
using System.Collections;
|
||
using Tamir.SharpSsh.jsch;
|
||
using Tamir.Streams;
|
||
using System.Text;
|
||
|
||
namespace Tamir
|
||
{
|
||
public class SshHelper
|
||
{
|
||
|
||
private StreamReader reader;
|
||
private PipedOutputStream writer_po;
|
||
private Session session;
|
||
private ChannelShell channel;
|
||
private string host;
|
||
|
||
public SshHelper(string host, string username, string password)
|
||
{
|
||
this.host = host;
|
||
JSch jsch=new JSch();
|
||
Session session=jsch.getSession(username, host, 22);
|
||
session.setPassword( password );
|
||
|
||
Hashtable config=new Hashtable();
|
||
config.Add("StrictHostKeyChecking", "no");
|
||
session.setConfig(config);
|
||
|
||
session.connect();
|
||
|
||
channel=(ChannelShell)session.openChannel("shell");
|
||
|
||
writer_po = new PipedOutputStream();
|
||
PipedInputStream writer_pi = new PipedInputStream( writer_po );
|
||
|
||
PipedInputStream reader_pi = new PipedInputStream();
|
||
PipedOutputStream reader_po = new PipedOutputStream( reader_pi );
|
||
reader = new StreamReader (reader_pi,Encoding.UTF8);
|
||
|
||
|
||
channel.setInputStream( writer_pi );
|
||
channel.setOutputStream( reader_po );
|
||
|
||
channel.connect();
|
||
channel.setPtySize(132, 132, 1024, 768);
|
||
|
||
}
|
||
|
||
public void Write(string data)
|
||
{
|
||
data += "\n";
|
||
writer_po.write( Util.getBytes(data ));
|
||
}
|
||
|
||
public string WriteAndRead(string data)
|
||
{
|
||
Write( data );
|
||
return ReadResponse();
|
||
}
|
||
|
||
public void SendCtrlC()
|
||
{
|
||
byte ASCII_CTRL_C = 3;
|
||
byte[] ctrlc = { ASCII_CTRL_C };
|
||
writer_po.write( ctrlc );
|
||
}
|
||
|
||
public void SendCtrlZ()
|
||
{
|
||
byte ASCII_CTRL_Z = 26;
|
||
byte[] ctrlz = { ASCII_CTRL_Z };
|
||
writer_po.write( ctrlz );
|
||
}
|
||
|
||
public string ReadResponse()
|
||
{
|
||
// return ReadLine();
|
||
return ReadTest();
|
||
}
|
||
|
||
public string ReadBuffer(int size)
|
||
{
|
||
string res = "";
|
||
int buff;
|
||
try
|
||
{
|
||
buff = reader.Read();
|
||
while( ((char)buff != '#') && (size != 0) )
|
||
{
|
||
res += (char)buff;
|
||
size--;
|
||
if (res.EndsWith("More--"))
|
||
writer_po.write(Util.getBytes( " ") );
|
||
buff = reader.Read();
|
||
}
|
||
if(buff != '\n')
|
||
res += (char)buff;
|
||
}
|
||
catch//(Exception exc)
|
||
{
|
||
}
|
||
res = RemoveJunk( res );
|
||
return res;
|
||
}
|
||
|
||
public void Close()
|
||
{
|
||
channel.disconnect();
|
||
writer_po.close();
|
||
reader.Close();
|
||
}
|
||
|
||
// private string ReadLine()
|
||
// {
|
||
// string res = "";
|
||
// int buff;
|
||
// try
|
||
// {
|
||
// buff = reader.ReadByte();
|
||
// while((char)buff != '#')
|
||
// {
|
||
// res += (char)buff;
|
||
// if (res.EndsWith("More--"))
|
||
// writer_po.write( Util.getBytes(" ") );
|
||
// buff = reader.ReadByte();
|
||
// }
|
||
// if(buff != '\n')
|
||
// res += (char)buff;
|
||
// }
|
||
// catch//Exception exc)
|
||
// {
|
||
// }
|
||
// res = RemoveJunk( res );
|
||
// return res;
|
||
// }
|
||
|
||
private string ReadTest()
|
||
{
|
||
StringBuilder res = new StringBuilder();
|
||
char[] buff = new char[1024];
|
||
int count = 0;
|
||
|
||
try
|
||
{
|
||
count = reader.Read(buff, 0, buff.Length);
|
||
//ArrayList lstBuff = new ArrayList(java.util.Arrays.asList(buff));
|
||
while(!Util.ArrayContains(buff, '#', count))
|
||
{
|
||
// while(buff[count-2]!='#' ){
|
||
res.Append( buff, 0, count );
|
||
if ( (res.ToString().EndsWith("More--"))||(res.ToString().EndsWith("More--[m")))
|
||
writer_po.write( Util.getBytes( " ") );
|
||
count = reader.Read(buff, 0, buff.Length);
|
||
count++;
|
||
count--;
|
||
//lstBuff = new ArrayList(java.util.Arrays.asList(buff));
|
||
}
|
||
if(buff[count-1] != '\n')
|
||
res.Append( buff, 0, count );
|
||
else
|
||
res.Append( buff, 0, count-1 );
|
||
}
|
||
catch//(Exception exc)
|
||
{
|
||
}
|
||
return RemoveJunk( res ).ToString();
|
||
}
|
||
|
||
private static string RemoveJunk(string str)
|
||
{
|
||
string[] junk = new string[]{"[132;1H", "[24;1H", "[K", "[7m", "[m", " \b", "--More--", "\r", "\n "};
|
||
|
||
for( int i=0; i<junk.Length; i++ )
|
||
{
|
||
string match = junk[i];
|
||
if (match=="\n ")
|
||
str = Replace(str, match, " ");
|
||
else
|
||
str = Replace(str, match, "");
|
||
|
||
}
|
||
return str;
|
||
}
|
||
|
||
private static StringBuilder RemoveJunk(StringBuilder str)
|
||
{
|
||
string[] junk = new string[]{"[132;1H", "[24;1H", "[K", "[7m", "[m", " \b", "--More--", "\n "};
|
||
|
||
for( int i=0; i<junk.Length; i++ )
|
||
{
|
||
string match = junk[i];
|
||
if (match=="\n ")
|
||
str = Replace(str, match, " ");
|
||
else
|
||
str = Replace(str, match, "");
|
||
|
||
}
|
||
return str;
|
||
}
|
||
|
||
private static string Replace(string str, string toReplace, string replcaeWith)
|
||
{
|
||
int index = (str.IndexOf( toReplace ));
|
||
while (index != -1)
|
||
{
|
||
string pre = str.Substring(0, index);
|
||
string post = str.Substring(index+toReplace.Length, str.Length-index-toReplace.Length);
|
||
str = pre + replcaeWith + post;
|
||
index = (str.IndexOf( toReplace ));
|
||
}
|
||
return str;
|
||
}
|
||
private static StringBuilder Replace(StringBuilder str, string toReplace, string replcaeWith)
|
||
{
|
||
return str.Replace(toReplace, replcaeWith);
|
||
}
|
||
|
||
}
|
||
}
|
||
|