SparkleShare/SharpSSH/SshHelper.cs
2010-07-15 20:41:37 +01:00

221 lines
5.1 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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--")))
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[]{"", "", "", "", "", " \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[]{"", "", "", "", "", " \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);
}
}
}