SharpSsh outputstream in TextBox weergeven

Pagina: 1
Acties:
  • 525 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • laserfreak
  • Registratie: Augustus 2007
  • Laatst online: 04-09 22:04
Hallo,

Ik ben sinds een 4-tal dagen begonnen met C# in plaats van VB omwille van het feit dat er veel meer ondersteuning is en je er meer mee kan. Ik probeer een programma te schrijven om via SSH een terminal op te zetten.
Om dit te doen maak ik gebruik van de OpenSource SSH bibliotheek ShaprSsh van Tamir Gal, dat leek me veel simpeler dan de Grandados bibiliotheek te gebruiken. Ik heb het al zover gekregen dat ik perfect kan verbinden en ook de verbinding verbreken met de gewenste doelhost, gebruikersnaam en paswoord.

Ik krijg echter enkel output naar een Console gestuurd (alle examples zijn Console software) ik wil echter voor mijn applicatie een GUI en ik wil dus dat de OuputStream naar een Textbox geschreven wordt. En daar zit mijn probleem.

Dit is mijn code:
[code=C#]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tamir.SharpSsh.jsch;
using Tamir.Streams;
using System.Text.RegularExpressions;
using System.IO;

namespace WindowsFormsApplication1
{
public partial class index : Form
{
private Session session;
private Channel channel;
private Stream m_in;
private Stream m_out;

public index()
{
InitializeComponent();
}

private void index_Load(object sender, EventArgs e)
{
this.toolStripStatusLabel1.Text = ("Wacht op gebruikersinvoer");
m_in = channel.getInputStream();
m_out = channel.getOutputStream();
}

private void verbind_Click(object sender, EventArgs e)
{
try
{
//een nieuwe JSch instantie creeëren
JSch jsch = new JSch();

//gebruikernaam en paswoord in de variabelen steken
String host = IP.Text;
String user = gebruikersnaam.Text;
String passwd = wachtwoord.Text;

//een nieuwe SSH sessie opstarten
session = jsch.getSession(user, host, 22);

//wachtwoord instellen
session.setPassword(passwd);

//wij zullen geen strikte RSA sleutel gebruiken
System.Collections.Hashtable config = new System.Collections.Hashtable();
config.Add("StrictHostKeyChecking", "no");
session.setConfig(config);

//verbinden met SSH server
session.connect();


//een nieuw Shell kanaal openen in de SSH sessie
channel = session.openChannel("shell");

[u][b] //Streams instellen
channel.setOutputStream(Console.OpenStandardOutput());[/b][/u]


//verbinen met het kanaal
channel.connect();
MessageBox.Show("Verbonden met de host!");
this.toolStripStatusLabel1.Text = ("Verbonden met de host");
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}

}
private void disconnect_Click(object sender, EventArgs e)
{
try
{
//het kanaal sluiten
channel.disconnect();
session.disconnect();
this.toolStripStatusLabel1.Text = ("Verbinding met host verbroken");
}
catch(Exception eee)
{
MessageBox.Show(eee.Message);
}
}
private void index_Load_1(object sender, EventArgs e)
{
}
}
}

[/ code]

het vette en onderlijnde gedeelte zegt dus dat de OutputStream naar een Console geschreven moet worden, ik wil echter dat het naar een textbox gaat.
Ik heb al vanalles geprobeerd maar als het al geen errors geeft bij het builden van de applicatie dan loopt de applicatie bij het verbinden (als de eerste data ontvangen wordt) gewoon vast.

Ik hoop dat er een oplossing voor is,
Mvg,
Laserfreak

Liefhebber van embedded hardware en software


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Kun je alle code even tussen [ code=C# ] [ / code ] tags stoppen en dan ook even de indenting fixen, dan is het wat aangenamer om naar te kijken en dan kunnen we je helpen zonder dat het osn heel veel moeite kost om uit te vinden wat er allemaal gebeurt :).

Verder hoef je niet te groeten hier :).

Edit:

Maar wat ik denk dat je moet doen: een stream blijft data geven, je zult zelf een Stream moeten declareren en dan die als output stream zetten. Daarna moet je een StreamReader declareren die dan weer die Stream leest (misschien kan je ook gewoon direct de stream opvragen van het Ssh object).

Dan kun je met de streamreader gewoon iets doen alla
C#:
1
while(...){textbox1.text += myStreamReader.Readline + Environment.Newline; }


Echt mooi zou het zijn als je dit in een appart thread zet en dan via events af en toe de textbox update :).

[ Voor 49% gewijzigd door roy-t op 02-07-2010 15:33 ]

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • laserfreak
  • Registratie: Augustus 2007
  • Laatst online: 04-09 22:04
Hallo,

dankjwel voor de snelle reply. Ik heb dus een Stream gedeclareerd 'm_out' genoemd en dan een StreamReader gemaakt. Dan heb ik je voorbeeld gebruikt, maar hij geeft nog wat errors.

Even mijn code:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
...
private Stream m_out
...
m_out = channel.getOutputStream();;
...


                //Streams instellen
                StreamReader myStreamReader = new StreamReader(m_out);
                while (m_out.CanRead)
                {
                    txtin.Text = myStreamReader.ReadLine + Environment.NewLine;
                }



error die hij geeft is de volgende:
Operator '+' cannot be applied to operands of type 'method group' and 'string'

Ik ben echt nog een beginner, ik vind niet direct een oplossing.


dit heb ik intussen opgelost door '()' na de ReadLine te plaatsen:
C#:
1
txtin.Text = myStreamReader.ReadLine() + Environment.NewLine;


nu kan ik mijn programma runnen, maar vanaf dat ik verbinding maak met de SSH server en er data binnenkomt krijg ik de melding:
'Waarde kan niet null zijn, parameternaam Streams'

dit kreeg ik ook met vorige oplossingen die ik probeerde, wat wil dit eigenlijk juist zeggen en wat kan ik eraan doen?

alvast bedankt

laserfreak

[ Voor 23% gewijzigd door laserfreak op 02-07-2010 17:11 ]

Liefhebber van embedded hardware en software


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Just out of curiosity:
laserfreak schreef op vrijdag 02 juli 2010 @ 14:37:
omwille van het feit dat <...> je er meer mee kan.
Zou je dat eens willen toelichten? Want dit is (zo goed als) klinkklare onzin. Niet dat ik VB.Net nou boven C# stel maar ze maken beide gebruik van hetzelfde .Net framework en je moet al gekke dingen willen wil je er "last" van hebben, zeker bij recente(re) versies.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • laserfreak
  • Registratie: Augustus 2007
  • Laatst online: 04-09 22:04
Wel ik heb mij wat verkeerd uitgedrukt denk ik. Ik vind dat er voor veel meer dingen voorbeelden te vinden zijn in C# dan voor Visual Basic, en daarom kan ik er als beginner wat meer mee.

____
Ik ben weer wat verder

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tamir.SharpSsh.jsch;
using Tamir.Streams;
using System.Text.RegularExpressions;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class index : Form
    {
        private Session session;
        private Channel channel;
        private Stream m_in;
        private Stream m_out;
        public String input;
     
        public index()
        {
            InitializeComponent();    
        }

        private void index_Load(object sender, EventArgs e)
        {
            this.toolStripStatusLabel1.Text = ("Wacht op gebruikersinvoer");
           
        }

        private void verbind_Click(object sender, EventArgs e)
        {
            try
            {
                //een nieuwe JSch instantie creeëren
                JSch jsch = new JSch();
                
                //gebruikernaam en paswoord in de variabelen steken
                String host = IP.Text;
                String user = gebruikersnaam.Text;
                String passwd = wachtwoord.Text;

                //een nieuwe SSH sessie opstarten
                session = jsch.getSession(user, host, 22);

                //wachtwoord instellen
                session.setPassword(passwd);

                //wij zullen geen strikte RSA sleutel gebruiken
                System.Collections.Hashtable config = new System.Collections.Hashtable();
                config.Add("StrictHostKeyChecking", "no");
                session.setConfig(config);

                //verbinden met SSH server
                session.connect();
                

                //een nieuw Shell kanaal openen in de SSH sessie
                channel = session.openChannel("shell");

                //verbinen met het kanaal
                channel.connect();
                MessageBox.Show("Verbonden met de host!");
                this.toolStripStatusLabel1.Text = ("Verbonden met de host");

                //Streams
                m_in = channel.getInputStream();
                m_out = channel.getOutputStream();

                StreamReader myStreamReader = new StreamReader(m_out);
                while (m_out.CanRead)
                {
                    while (m_out != null)
                    {
                        txtin.Text = myStreamReader.ReadLine() + Environment.NewLine;
                    }
                }
 


            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message);
            }   

        }
        private void disconnect_Click(object sender, EventArgs e)
        {
            try
            {
                //het kanaal sluiten
                channel.disconnect();
                session.disconnect();
                this.toolStripStatusLabel1.Text = ("Verbinding met host verbroken");
            }
            catch(Exception eee)
            {
                MessageBox.Show(eee.Message);
            }    
        }
        private void index_Load_1(object sender, EventArgs e)
        {
        }

        private void send_Click(object sender, EventArgs e)
        {
            StreamReader myStreamReader1 = new StreamReader(m_in);
            if (m_in.CanWrite)
            {
                if (m_in != null)
                {
                    txtin.Text = myStreamReader1.ReadLine() + Environment.NewLine;
                }
            }
        }
    }
}


ik heb er dus de voorwaarde bij geplaatst dat hij de Streams niet null mogen zijn, nu krijg is als melding bij het verbinden:

'De stroom is niet leesbaar'

Is daar iets aan te doen, ik weet namelijke zeker dat het een stroom is die als string moet kunnnen weergegeven worden aangzien het een terminal is die ik open die alles in ASCII doorstuurd en als ik het in een console bekijk geeft hij dat dan ook zo weer.

Mvg

Mvg

[ Voor 91% gewijzigd door laserfreak op 02-07-2010 21:09 ]

Liefhebber van embedded hardware en software


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Ik zou ten eerste je if lussen omdraaien. Je gaat nu eerst controleren op m_in.CanWrite en dan of m_in wel misschien NULL kan zijn. Je kan trouwens ook meerdere controles doen in dezelfde if.
C#:
1
2
3
4
if (m_in != null && m_in.CanWrite) 
{
// code
}
Wat er voor zorgt dat indien m_in null is de lus al niet uitgevoerd wordt en dus ook m_in.CanWrite wat een probleem zou kunnen opleveren zijn als m_in null is.

Ik neem aan dat je met visual studio werkt, misschien is het dan handig om eens te leren hoe breakpoints werken. Wordt er trouwens niet aangegeven op welke regel de fout zich situeert?

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
De techniek boven werkt trouwens door dat C# met && "short circuit" (meteen als de eerste waarde false is al stopt bij && en meteen als de eerste waarde true is bij || doorgaat).

Verder ken ik SharpSsh niet, maar misschien is een output stream zetten wel de verkeerde manier, kun je niet van de SharSsh class een output screem krijgen (.GetOutputStream()).

Oh en trouwens () staat altijd achter een methode, zelfs als deze geen argumenten heeft. (Met argumenten is het natuurlijk methode(arg1, arg2, arg..);

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • laserfreak
  • Registratie: Augustus 2007
  • Laatst online: 04-09 22:04
Hallo,

Ik heb de 'try en catch' weggelaten zodat ik Breakpoints te zien krijg in de programmatuur. Als ik dus de stroom nog maar begin te lezen krijg ik hier een breakpoint, zelfde gebeurt bij het schrijven:


http://home.euphonynet.be/dpcomputers/error.png

als ik op vieuw details klik dan zie ik dit:
http://home.euphonynet.be/dpcomputers/error2.png

ik definieer 'm_in' en 'm_out' dus zo:
C#:
1
2
m_in = channel.getInputStream(); 
m_out = channel.getOutputStream(); 


wat kan het zijn?

[ Voor 11% gewijzigd door laserfreak op 03-07-2010 10:45 ]

Liefhebber van embedded hardware en software


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Hele rare error, ik denk dat je het het beste even kan vragen aan de makers van SharpSsh (is daar geen forum of mailinglist?). Want dit begint aardig specifiek te worden.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

RobIII schreef op vrijdag 02 juli 2010 @ 18:34:
Just out of curiosity:

[...]

Zou je dat eens willen toelichten? Want dit is (zo goed als) klinkklare onzin. Niet dat ik VB.Net nou boven C# stel maar ze maken beide gebruik van hetzelfde .Net framework en je moet al gekke dingen willen wil je er "last" van hebben, zeker bij recente(re) versies.
Volgens mij kan je zelfs, alhoewel dat met .NET 4.0 weer wat meer gelijk getrokken is, meer met VB.Net dan met C#. Niet dat je dat wilt gebruiken maar toch :)

//EDIT:
Epic vertaling, de stroom is niet leesbaar :*)

[ Voor 5% gewijzigd door Phyxion op 03-07-2010 11:32 ]

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • laserfreak
  • Registratie: Augustus 2007
  • Laatst online: 04-09 22:04
Hallo,

Ik had een mail gestuurd naar de ontwerper van ssh, maar ik heb ondertussen na lang zoeken mijn code wat aangepast tot dit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Tamir.SharpSsh.jsch;
using Tamir.Streams;
using System.Text.RegularExpressions;
using System.IO;
using Tamir.SharpSsh;

//BSD license :
//Copyright (c) 2006 Tamir Gal, http://www.tamirgal.com, All rights reserved. 

 
namespace WindowsFormsApplication1
{
    public partial class index : Form
    {
        public SshShell shell; 
        public String input;
        public String publichost;
        public String response;

        public index()
        {
            InitializeComponent();
        }

        private void index_Load_1(object sender, EventArgs e)
        {
            this.toolStripStatusLabel1.Text = ("Wacht op gebruikersinvoer");
        }
        private void verbind_Click(object sender, EventArgs e)
        {
            try
            {
                //gebruikernaam en paswoord in de variabelen steken 
                String host = IP.Text;
                String user = gebruikersnaam.Text;
                String passwd = wachtwoord.Text;

                //gebruikersnaam, host, paswoord, ...
                shell = new SshShell(host, user);
                shell.Password = passwd;

                //verbinden
                shell.Connect();
                MessageBox.Show("Verbonden met host: " + host);
                toolStripStatusLabel1.Text = ("Verbonden met host: " + host);

                //Streams
                int readCount = 0;
                byte[] buff = new byte[1024];

                while (true)
                {
                    readCount = shell.IO.Read(buff, 0, buff.Length);
                    if (readCount == -1) break;
                    response = System.Text.Encoding.Default.GetString(buff, 0, readCount);
                    txtin.AppendText(response);
                    txtin.ScrollToCaret();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }
        private void disconnect_Click(object sender, EventArgs e)
        {
            //de shell sluiten
            shell.Close();
            this.toolStripStatusLabel1.Text = ("Verbinding met host: " + publichost + " verbroken");
        }
        private void send_Click(object sender, EventArgs e)
        {
            shell.WriteLine(txtout.Text);
        }
    }
}


Ik kan hiermee bij het inloggen eenmalig mijn data weergeven in een TextBox, waarna het programma onmiddelijk vastloopt. Ik denk dat dit komt omdat hij in een de while(true) lus blijft vastzitten. Mijn idee was nu om een soort event aan te maken dat iedere keer als er iets nieuws in de Stream geschreven wordt door de remote server ik de routine uitvoer die de Stream leest en doorstuurd.

Is dit makkelijk te doen?

Mvg
Laserfreak

Liefhebber van embedded hardware en software


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

Ik ben er klaar mee. Je post nu tot drie keer toe dezelfde lappen code, met misschien een of twee wijzigingen. Nu moeten we elke keer die complete lap gaan lezen. Daarbij krijg ik steeds meer het idee dat je aan het handje gehouden wil worden, daar houden we ook niet zo van. Zie Programming FAQ - Het FAQ/Beleid topic nog eens.

Oh ja, wij Tweakers doen elkaar altijd de groeten.

Anyone who gets in between me and my morning coffee should be insecure.

Pagina: 1

Dit topic is gesloten.