Forum: PC-Programmierung SSH Tunnel öffnen - voanders schließen


von Kai (Gast)


Lesenswert?

Hallo zusammen,

ich habe mir mit diesem Tutorial Video hier:
https://www.youtube.com/watch?v=YUhlS47SccU

einen SSH Tunnel aufgemacht.
1
        private void ssh_connect()
2
        {
3
            PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("xxxxxxxxx.stratoserver.net", 22, txtbx_login.Text, txtbx_pwd.Text);
4
            //Timespan erstellt eine Zeitintervall für den Timeout der Verbindung. In diesem Fall 30 Sekunden.
5
            connectionInfo.Timeout = TimeSpan.FromSeconds(30);
6
            var client = new SshClient(connectionInfo);
7
8
            try
9
            {
10
                client.Connect();
11
                if (client.IsConnected)
12
                {
13
                    MessageBox.Show("SSH connection established!");
14
                }
15
                else
16
                {
17
                    MessageBox.Show("SSH connection failed!");
18
                }
19
20
                var portFwdL = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
21
                client.AddForwardedPort(portFwdL);
22
23
                portFwdL.Start();
24
25
                if (portFwdL.IsStarted)
26
                {
27
                    MessageBox.Show("Port sucessfully forwarded");
28
                }
29
                else
30
                {
31
                    MessageBox.Show("Port forwarding failed");
32
                }
33
            }
34
            catch (SshException e)
35
            {
36
                MessageBox.Show(e.Message);
37
            }
38
39
        }
In dem Video wird der Tunnel in der selben Funktion aber wieder 
geschlossen.
Ich möchte den Tunnel allerdings solange offen lassen bis ich ihn 
manuell wieder schließen möchte (button drücken).
1
Eine zweite Funktion wie diese hier:
2
        public void ssh_disconnect()
3
        {
4
            portFwdL.Stop();
5
            client.Disconnect();
6
        }
kann natürlich nicht auf die portFwdL und client zugreifen.
Wie würdet ihr das machen?

Grüße
Kai

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Kai schrieb:

> Wie würdet ihr das machen?

So wie immer.

Wenn Objekte in mehr als einer Funktion gebraucht werden, dann werden 
sie wohl nicht ...
1
        private void ssh_connect()
2
        {
3
            PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("xxxxxxxxx.stratoserver.net", 22, txtbx_login.Text, txtbx_pwd.Text);
4
            //Timespan erstellt eine Zeitintervall für den Timeout der Verbindung. In diesem Fall 30 Sekunden.
5
            connectionInfo.Timeout = TimeSpan.FromSeconds(30);
6
            var client = new SshClient(connectionInfo);
... als funktionslokale Objekte existieren können, sondern werden zu 
Membervariablen der Klasse (und damit des davon erzeugten Objektes) 
werden müssen, damit alle Funktionen dieser Klasse auf diese 
Membervariablen Zugriff haben.

: Bearbeitet durch User
von Kai (Gast)


Lesenswert?

Hallo Karl, danke für deine Antwort.. ich bin dazu zu dämlich...

Zu deinem Stichwort Membervariablen habe ich jetzt den Aufbau einer 
Klasse gefunden:
1
public class Person
2
{
3
   // Membervariablen
4
   private string vor ;
5
   private string nach;
6
7
   //Zugriffsmethoden für lesenden Zugriff
8
   public string GetVorname()
9
   {
10
      return vor;
11
   }
12
13
   public string GetNachname()
14
   {
15
      return nach;
16
   }
17
18
   //Zugriffsmethoden für schreibenden Zugriff
19
   public void SetVorname(string v)
20
   {
21
      vor = v ;
22
   }
23
24
   public void SetNachname(string n)
25
   {
26
      nach = n ;
27
   }
28
29
}
Jetzt werden hier Membervariablen erstellt, allerdings lediglich 
Strings.
Wie kann denn ein Objekt als Membervariable dienen?

Hab jetzt mal einfach gedacht und die Strings ausgetauscht:
1
        class ssh
2
        {
3
4
                PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("xxxxxxxxx.stratoserver.net", 22, txtbx_login.Text, txtbx_pwd.Text);
5
                var client = new SshClient(connectionInfo);
6
                var portFwdL = new ForwardedPortLocal("127.0.0.1", 3306, "127.0.0.1", 3306);
7
8
.
9
.
10
.
11
}
Die funktioniert natürlich nicht.. Im Internet finde ich leider auch nur 
Beispiele mit integers oder strings als Membervariable, nicht aber 
Objekte..

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Kai schrieb:
> Hallo Karl, danke für deine Antwort.. ich bin dazu zu dämlich...

sieht wohl so aus.


Das hier
>
1
> public class Person
2
> {
3
>    // Membervariablen
4
>    private string vor ;
5
>    private string nach;
6
>

sieht doch völlig anders aus, als das von dir geschriebene
>
1
        class ssh
2
>         {
3
> 
4
>                 PasswordConnectionInfo connectionInfo = new 
5
> PasswordConnectionInfo("xxxxxxxxx.stratoserver.net", 22, 
6
> txtbx_login.Text, txtbx_pwd.Text);
7
>                 var client = new SshClient(connectionInfo);
8
>                 var portFwdL = new ForwardedPortLocal("127.0.0.1", 3306, 
9
> "127.0.0.1", 3306);
10
>

das kann ein Blinder auf 15 Meter Entfernung greifen.

Vielleicht solltest du weniger Video schauen und dir mal ein 
Einsteigerbuch für C# zulegen. Oder zumindest mal ein Videotutorial für 
Einsteiger :-)
1
        class ssh
2
        {
3
          private SshClient client;
4
          private ForwardedPortLocal portFwdL;
5
...

Wenigstens rudimentäre Kentnisse seiner Programmiersprache sollte man 
schon haben. Zumindest für die wirklich ganz einfachen Dinge.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Kai schrieb:
> Die funktioniert natürlich nicht..

weil du mehr machst als die Variablen anlegen
1
 class ssh
2
        {
3
4
            
5
                SshClient client;
6
                ForwardedPortLocal portFwdL
7
}

dann kannst du die Objekte in deiner connect funktion initialisieren.

von Kai (Gast)


Lesenswert?

Karl Heinz schrieb:
> sieht wohl so aus.

Danke, bin halt kein Programmierer und die Denkweise ist mir nicht immer 
klar.
In einem Fall legt man ein Objekt gleich mit allem möglichen Kram an, in 
diese Fall fügt mal den Kram erst später hinzu, woher soll ein Anfänger 
das wissen?

von Peter II (Gast)


Lesenswert?

Kai schrieb:
> woher soll ein Anfänger das wissen?
in dem man selber etwas rumprobiert und nicht nach 10min aufgibt und in 
Foren sucht/fragt.

Wissen kommt vom selbständig lernen und nicht vom Copy and Paste.

Das sind einfach Grundlagen, jeder objektorientierten Programmierung. 
Sind nicht mal von der Sprache abhängig.

von Peter II (Gast)


Lesenswert?

nachtrag:

und von YT kann man nichts sinnvolles lernen
> ich habe mir mit diesem Tutorial Video hier:
> Youtube-Video "MySQL Connection über SSH in C# .NET - Tutorial"


Bücher/Webseite/Doku sind enthalten alles viel mehr Infos als 
irgendwelche Videos.

von Stefan (Gast)


Lesenswert?

Karl Heinz schrieb:

> sieht doch völlig anders aus, als das von dir geschriebene
> class ssh
>>         {
>>
>>                 PasswordConnectionInfo connectionInfo = new
>> PasswordConnectionInfo("xxxxxxxxx.stratoserver.net", 22,
>> txtbx_login.Text, txtbx_pwd.Text);
>>                 var client = new SshClient(connectionInfo);
>>                 var portFwdL = new ForwardedPortLocal("127.0.0.1", 3306,
>> "127.0.0.1", 3306);
>>

Ist aber prinzipiell ok.
Was vermutlich nicht so gut kommt, txtbx_login.Text und txtbx_pwd.Text 
müssen zu diesem Zeitpunkt noch nicht unbedingt bekannt oder konstruiert 
sein. Gibt dann entweder Mecker vom, na nennen wir das mal, Compiler 
oder einen Crash. Vielleicht postet der geneigte TO ja mal eine etwas 
bessere Fehlermeldung als 'funktioniert nicht' oder wir raten einfach 
munter weiter.

Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.