SSH Verbindung aufbauen, Script übertragen und dieses starten

  • VB.NET
  • .NET 5–6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

    SSH Verbindung aufbauen, Script übertragen und dieses starten

    Moin Zusammen,

    ich habe bisher eine Windows Batch Datei genutzt um Dateien von meinem WIndows PC auf einen Linux PC zu übertragen und diese dann zu starten.
    Als Brücke habe ich Putty bzw. pscp und plink genutzt.
    Das ganze sieht so aus:

    Brainfuck-Quellcode

    1. ​echo "START PC1---------------------------------------------------------"
    2. ::
    3. ::AB HIER DIE RIG DATEN EINGEBEN
    4. ::
    5. SET NAME=PC Name
    6. SET IP=IP Adresse
    7. SET BN=Benutzername
    8. SET PW=Passwort
    9. ::
    10. ::Systemanweisungen (Hier nichts ändern)
    11. echo %NAME% > name.text
    12. pscp -pw %PW% startscript.sh %BN%@%IP%:/user/startscript.sh
    13. C:\Programme\Putty\plink.exe -ssh %IP% -l %BN% -pw %PW% -batch -m ..\Systemdateien\linuxanweisungen.txt
    14. echo "Fertsch"


    Im ersten Schritt übertrage ich die Datei mit pscp und starte dann die Linux befehle, welche in der linuxanweisung.txt stehen.

    Soweit so gut. Das funktioniert.

    Jetzt wollte ich das ganze in VB.NET machen.
    Natürlich könnte ich mir jetzt einfach die plink.exe und die pscp.exe nehmen und aus meinen VB Programm raus diese Programme ansteuern und alles laufen lassen.
    Ich werde dann aber vermutlich keine Rückmeldungen in meiner "GUI" erhalten, wenn Fehler auftreten, wie z.b. eine nicht aufgebaute Verbindung.

    Ich finde leider keine Codebeispiel wie ich das im VB realisieren kann.
    Ich schaue jetzt schon seit zwei Tagen bei Google und durch Foren, aber finde keinen Ansatz.

    Nocheinmal zusammenfassend, was passieren soll.
    Ich habe ein VB Programm, welches ein Linux Script von Windows nach Linux übertragen soll. Anschließend muss auf dem Linux PC das Script gestartet werden.
    Hi.

    Es kann alles, was bisher in der Konsole geschah mittels VB.NET in eine UI gepackt werden.

    Ich verwende SCP unter Windows 11 und übertrage und/füge hinzu in Dateien. (z.B. SSH Schlüsselaustausch etc.)

    Die Windows Konsole arbeitet mit drei "Pipes" STD, Error und Debug, und kann bis zu 10 insgesamt verwenden.

    Damit kann in der UI/.NET Anwendung alles verarbeiten.

    Hier mal ein Post mit ProcessInfo/ProcessStartInfo, die dann Windows-Prozesse anlegen und verwalten kann.

    Wenn das rudimentär geht, mit dem Aufruf der Batch-Commands, können diese dann optimiert werden.

    learn.microsoft.com/en-us/dotn…essstartinfo?view=net-7.0

    learn.microsoft.com/en-us/dotn…tandarderror?view=net-7.0

    Ich glaube das ProcessInfo in .NET 7.0 jetzt ProcessStartInfo geworden ist, und das ältere Beispiele angepasst werden müssen.

    Den öffentlichen Schlüssel in den RasberryPi, zum Beispiel, kopieren (Anfügen an Datei "authorized_keys").

    Quellcode

    1. type .\theKEY_rsa.pub | ssh joshi@remotelinux "mkdir -p ~/.ssh && cat >> .ssh/authorized_keys"


    Es geht auch anders den Key zu übertragen, aber ich will nicht (will ja Stack-Overflow nicht verpetzen ...).

    VB.NET-Quellcode

    1. Dim cmd_Prozess As New System.Diagnostics.Process()
    2. cmd_Prozess.StartInfo.WorkingDirectory = "C:\\Der\Pfad\zu den\SSH\Keys\unter\Windows\"
    3. cmd_Prozess.StartInfo.FileName = "type"
    4. cmd_Prozess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    5. cmd_Prozess.StartInfo.Arguments = " .\theKEY_rsa.pub | ssh joshi@remotelinux \"mkdir -p ~/.ssh && cat >> .ssh/authorized_keys\""
    6. .
    7. .
    8. .

    learn.microsoft.com/en-us/dotn…tandarderror?view=net-7.0
    Achtung bei \"mkdir evtl. muss das Anführungszeichen im Pfad korrigiert werden, habe das aus dem Kopf gemacht... :)

    Statt "type" dann "SCP.exe" für Dateiübertragung und mit "type" dann befehle an die Linux-Bash? Oder war es doch ssh?
    (SSH the Pure-Linux-XP of the Nineties! YEAH!)

    c.u. Joshi aus HaHa und viel Erfolg 8-) :)
    Dieses Thema ist über ein Monat nicht mehr aktiv, dennoch bin ich draufgestoßen.

    Vorab: bitte nutze nicht die SSH-Binary für sowas! Wenn es geht, verwende immer eine reine Code-Lösung, anstatt Binaries aufzurufen.

    Gerade was SSH und SCP angeht, gibt es eine super Bibliothek für .net: github.com/sshnet/SSH.NET
    Gibt's auch per NuGet.

    Ein ganz simples Beispiel in C# (aus dem Repo geklaut):

    C#-Quellcode

    1. ​byte[] expectedFingerPrint = new byte[] {
    2. 0x66, 0x31, 0xaf, 0x00, 0x54, 0xb9, 0x87, 0x31,
    3. 0xff, 0x58, 0x1c, 0x31, 0xb1, 0xa2, 0x4c, 0x6b
    4. };
    5. using (var client = new SshClient("sftp.foo.com", "guest", "pwd"))
    6. {
    7. client.HostKeyReceived += (sender, e) =>
    8. {
    9. if (expectedFingerPrint.Length == e.FingerPrint.Length)
    10. {
    11. for (var i = 0; i < expectedFingerPrint.Length; i++)
    12. {
    13. if (expectedFingerPrint[i] != e.FingerPrint[i])
    14. {
    15. e.CanTrust = false;
    16. break;
    17. }
    18. }
    19. }
    20. else
    21. {
    22. e.CanTrust = false;
    23. }
    24. };
    25. client.Connect();
    26. }


    Ich habe damit schon einige Programme gebaut und wir verwenden es bei uns in der Firma produktiv für Geräteverwaltung im Feld.
    10/10 kann ich bestens empfehlen!
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems

    Selbstständiger Softwareentwickler & IT-Techniker.