Forum: PC-Programmierung Mit c# ssh Verbindung aufbauen


von ssh_flasche (Gast)


Lesenswert?

Hallo und guten Morgen,
ich bin in der Windows Welt zu hause aber komme immer wieder in den 
Genuss mit der Linux Konsole zu spielen!
Leider habe ich ein schlechtes Gedächtnis und vergesse immer wieder die 
Shell Befehle.
Nun möchte ich mir ein kleines Programm basteln mit dem ich per 
Mausklick bestimmte Befehle an die Linux Maschine senden kann!
Ich habe zwar etwas gegoogelt aber nicht das richtige gefunden.
Kennt jemand ein Beispielprogramm in c# das eine SSH Verbindung aufbauen 
kann und befehle senden?

Lg
Richard

von nicht“Gast„ (Gast)


Lesenswert?

Moin,

Da gibt's nichts im Framework.

Schau dir mal die damit ssh lib an. Die benutze ich zur Zeit. Hat zwar 
die ein oder andere Schwäche, funktioniert aber im großen und ganzen.

von nicht“Gast„ (Gast)


Lesenswert?

Blödes Tablet

Tamir ssh lib muss es heißen

von Alex A. (alexdetsch)


Lesenswert?

Jap, SSH.NET funktioniert sehr gut. https://sshnet.codeplex.com/

von ssh_flasche (Gast)


Lesenswert?

Ist es sehr unverschämt wenn ich Euch um ein kleines Beispiel frage?
Denn das Beispiel aus dem Link ist etwas umfangreich :-(
Lg
Richard

von ssh_flasche (Gast)


Lesenswert?

Sorry ich komme mit der Dll nicht klar!
Hat jemand ein einfaches Beispiel damit ich vielleicht leichter 
verstehe?

Lg
Und Danke Richard

von Padauz (Gast)


Lesenswert?

Hast du dir mal die Hilfe angesehen?

http://sshnet.codeplex.com/releases/view/120565
SshNet Help

http://sshnet.codeplex.com/downloads/get/944154

Wenn du darin nach "examples" suchst, findest du rund 30 kleine 
Beispiele.
Falls der Inhalt der Hilfedatei nicht angezeigt wird, Rechtsklick auf 
die Datei im Windows Explorer -> Eigenschaften -> Zulassen.

BTW: Ich weiß nicht, wie man es hinbekommt, per Google keine Beispiele 
zu finden ...
"SSH.NET" "example"
oder
"SSH.NET" "sample"

von ssh_flasche (Gast)


Lesenswert?

Padauz schrieb:
> die Datei im Windows Explorer -> Eigenschaften -> Zulassen.

das wusste ich nicht!!
Danke

von ssh_flasche (Gast)


Lesenswert?

Habe einen winzigen Erfolg zu verzeichnen!:-D
1
private void button1_Click(object sender, EventArgs e)
2
        {
3
            var connectionInfo = new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");
4
            connectionInfo.Timeout = TimeSpan.FromSeconds(30);
5
            using (var client = new SshClient(connectionInfo))
6
            {
7
                client.Connect();
8
                if (client.IsConnected)
9
                {
10
                    var command = client.RunCommand("ls");
11
                    var result = command.Result;
12
13
                }
14
                else
15
                { 
16
                
17
                }
18
            }
19
        }

Nun kann ich eine Verbindung zum Raspberry aufbauen und das ls commando 
absetzen.

Nun möchte ich mit einem Button die Verbindung aufbauen und mit einem 
anderen Button die Befehle absetzen.
Wie kann ich von einem anderen Button auf die bevor geöffnete Verbindung 
zugreifen?
Lg
 und
Danke Richard!!

von Kommandozeilenpenner (Gast)


Lesenswert?

Leg das Verbindungsobjekt als Instanzvariable deiner Klasse an.

von ssh_flasche (Gast)


Lesenswert?

Kommandozeilenpenner schrieb:
> Leg das Verbindungsobjekt als Instanzvariable deiner Klasse an.

Wie macht man das?
Danke lg
Richard

von ssh_flasche (Gast)


Lesenswert?

Wie kann man
1
var connectionInfo = new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");
2
            connectionInfo.Timeout = TimeSpan.FromSeconds(30);
3
            using (var client = new SshClient(connectionInfo))

Wie kann ich darauf von der gesammten Klasse zugreifen?

von Alex A. (alexdetsch)


Lesenswert?

Wie gesagt: Deklariere Deine Connectioninfo als Instanzvariable. Wenn Du 
nicht weißt, was das ist, liest Du Dich besser nochmal in die Grundlagen 
der Programmierung ein. Du willst es doch nicht bloß zusammenkopieren, 
sondern auch verstehen, oder ;)
http://openbook.rheinwerk-verlag.de/visual_csharp_2012/

von ssh_flasche (Gast)


Lesenswert?

Alexander D. schrieb:
> Deklariere Deine Connectioninfo als Instanzvariable

Irgend wie reicht das nicht! Habe zwar
1
 PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");

ausprobiert aber im zweiten Button ist client.IsConnected
nicht mehr True!

Danke und Lg
Richard

von Kommandozeilenpenner (Gast)


Lesenswert?

Wo genau hast du jetzt die Zeile
1
PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");
stehen? Und wo wird client erzeugt?

Wenn du uns nur einzelne Code-Fetzen hinwirfst, werden wir dir nicht
helfen können.

von ssh_flasche (Gast)


Lesenswert?

Kommandozeilenpenner schrieb:
> Wo genau hast du jetzt die ZeilePasswordConnectionInfo connectionInfo =
> new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");stehen? Und
> wo wird client erzeugt?

Entschuldige bitte! Ich bin nicht im Stande "client" zusammen mit 
connectionInfo zu erzeugen!

Bist du bitte so nett und hilfst mir auf die Sprünge?
Danke und LG

Ps hier mein bescheidener Code!


1
namespace WindowsFormsApplication1
2
{
3
    public partial class Form1 : Form
4
    {
5
        public Form1()
6
        {
7
            InitializeComponent();
8
            
9
        }
10
        PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");
11
        
12
        private void button1_Click(object sender, EventArgs e)
13
        {
14
            //var connectionInfo = new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");
15
            connectionInfo.Timeout = TimeSpan.FromSeconds(30);
16
            using (var client = new SshClient(connectionInfo))
17
            {
18
                client.Connect();
19
                if (client.IsConnected)
20
                {
21
                    var command = client.RunCommand("ls");
22
                    var result = command.Result;
23
24
                }
25
                else
26
                { 
27
                
28
                }
29
            }
30
        }
31
32
        private void button2_Click(object sender, EventArgs e)
33
        {
34
            using (var client = new SshClient(connectionInfo))
35
            {
36
                client.Connect();
37
                if (client.IsConnected)
38
                {
39
                    var command = client.RunCommand("ifconfig");
40
                    var result = command.Result;
41
42
                }
43
                else
44
                {
45
46
47
                }
48
            }
49
        }

von c#ler (Gast)


Lesenswert?

1
namespace WindowsFormsApplication1
2
{
3
    public partial class Form1 : Form
4
    {   
5
    
6
        PasswordConnectionInfo connectionInfo;
7
        SshClient client;
8
        public Form1()
9
        {
10
            InitializeComponent();
11
            connectionInfo = new PasswordConnectionInfo("10.99.99.16", "pi", "raspberry");
12
            connectionInfo.Timeout = TimeSpan.FromSeconds(30);
13
            client = new SshClient(connectionInfo)
14
            client.Connect();
15
        }
16
        
17
        
18
        private void button1_Click(object sender, EventArgs e)
19
        {
20
                if (client.IsConnected)
21
                {
22
                    var command = client.RunCommand("ls");
23
                    var result = command.Result;
24
25
                }
26
                else
27
                { 
28
                
29
                }
30
        }
31
32
        private void button2_Click(object sender, EventArgs e)
33
        {
34
                if (client.IsConnected)
35
                {
36
                    var command = client.RunCommand("ifconfig");
37
                    var result = command.Result;
38
39
                }
40
                else
41
                {
42
43
                        
44
                }
45
        }

von c#ler (Gast)


Lesenswert?

ups hier fehlt ein semikolon:

client = new SshClient(connectionInfo)

wird zu

client = new SshClient(connectionInfo);

von ssh_flasche (Gast)


Lesenswert?

Vielen Dank für die Hilfe!!
Ich habe leider noch ein Problem das ich vom zweitem Button kein Result 
zurückbekomme!
Woran kann das liegen?

Vielen Dank
Lg

von foo (Gast)


Lesenswert?

ssh_flasche schrieb:
> Ich habe leider noch ein Problem das ich vom zweitem Button kein Result
> zurückbekomme!
> Woran kann das liegen?

An ifconfig.
ifconfig liegt für gewöhnlich in /sbin und das haben normale Benutzer 
nicht in $PATH

von Thorsten (Gast)


Lesenswert?


von ssh_flasche (Gast)


Lesenswert?

foo schrieb:
> An ifconfig.
> ifconfig liegt für gewöhnlich in /sbin und das haben normale Benutzer
> nicht in $PATH

Danke für die Antwort!
Ich bin mir aber nicht sicher ob Du damit Recht hast. Denn Wenn ich mit 
dem selben Benutzer Daten mit putty ifconfig ausführe bekomme ich eine 
Antwort!
Woran kann es also liegen?

Danke
Lg

von ssh_flasche (Gast)


Lesenswert?

Thorsten schrieb:
> Hi, schau Dir mal das Tutorial an.
>
> 
http://www.dreamincode.net/forums/topic/246911-c%23-multi-threading-in-a-gui-environment/

Danke für die Hilfe!
Sind im obigen Program die zwei button nicht im selben Thread?

Danke
Lg

von Thorsten (Gast)


Lesenswert?

1
 
2
private void button2_Click(object sender, EventArgs e)
3
        {
4
                if (client.IsConnected)
5
                {
6
                    var command = client.RunCommand("ifconfig");
7
                    var result = command.Result;
8
9
                }
10
                else
11
                {
12
13
                        
14
                }

Benutz doch mal den Debugger und setzte bei dem if einen Breakpoint, 
dann starte das Programm, drück dden Button und durchlaufe die Methode 
mit F11 (Single step). Die Werte werden Dir unten links im Fenster 
angezeigt.

von c#ler (Gast)


Lesenswert?

ssh_flasche schrieb:
> Danke für die Hilfe!
> Sind im obigen Program die zwei button nicht im selben Thread?

Ja sind Sie. Ich verstehe den Link in diesem Zusammenhang auch nicht..

von Jay (Gast)


Lesenswert?

Meine Güte, was für ein Rumgefummel, um sich ein paar Kommandos nicht 
merken zu müssen.

Wenn's schon sein muss, dann

- Auf Windows plink, oder bessern noch alle PuTTY-Programme installieren 
(http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html).

- SSH-Schlüssel generieren und austauschen.

Damit wird der Aufruf eines Remote-Kommandos zu einer Zeile:
1
<pfad zur putty-installation>/plink.exe <user>@<host> <Kommando>
Beispielsweise
1
<pfad zur putty-installation>/plink.exe pi@10.99.99.16 ls

Wer sich die Zeile nicht merken möchte, schreibt sie und ein PAUSE in 
einen Batch-Job, so richtig Old-School:
1
<pfad zur putty-installation>/plink.exe pi@10.99.99.16 ls
2
PAUSE

Mehrere Aufrufe die man sich nicht merken möchte? Mehrere Batch-Jobs. 
Jeweils mit vernünftigem Namen in einem Folder. Ein Doppelklick auf den 
gewünschten Job-Namen, fertig.

Keine Lust in jedem Batch-Job Parameter wie pi@10.99.99.16 reinschreiben 
zu müssen? SET und CALL.

Sowas wie eine Auswahl statt mehrerer Batch-Jobs? CHOICE

von ssh_flasche (Gast)


Lesenswert?

foo schrieb:
> ifconfig liegt für gewöhnlich in /sbin und das haben normale Benutzer
> nicht in $PATH

Also Du  hast recht mit root rechten funktioniert das Ganze!
Warum ist im Putty der Benutzer Pi ausreichend um ifconfig auszuführen?


Lg

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.