Hallo Leute,
ich habe erst seit gestern mit Ubuntu zu tun. Also entschuldigt bitte, wenn mir einige Sachen noch nicht so vertraut sind.
Ich möchte gerne eine C#-Anwendung schreiben, die in der Lage ist eine gezippte Datei von einem Windows-System (*.tar.gz) auf einen Linux-Server über SSH hochzuladen und ein SH-Script zur Auswertung dieser Datei laufen zu lassen. Die Auswertung wird durch das Script über StdOut zurückgegeben.
Im Terminal unter Linux muss man folgende Zeile eintippen, um die Funktion korrekt auszuführen:
1 | cat dummy.tar.gz | ssh root@192.168.13.7 /bin/remoteEvaluation.sh params |
Laut meinem Verständnis wird die tar-Datei erst in den StandardOutput geladen, welcher durch die Pipe zum StandardInput für das nächste Kommand (ssh) wird. Dem ssh wird als Parameter weiterhin mitgeteilt an welcher Adresse sich der Server befindet und wie die Datei heißt, die den Input auswertet.
Ich habe bereits eine C#-Bibliothek im Internet gefunden (SSH.Net), mit deren Hilfe ich mich zum Server verbinden und einzelne Commands auf dem Server ausführen kann. Dies hat auch wunderbar funktioniert:
1 2 3 4 5 6 7 | PrivateKeyFile key = new PrivateKeyFile(@"D:\Path\id_rsa"); SshClient sshClient = new SshClient("192.168.13.7", "usr", new PrivateKeyFile[] { key }); sshClient.Connect(); SshCommand cmd = sshClient.CreateCommand("ls -ltr"); cmd.Execute(); Console.WriteLine(cmd.Result); sshClient.Disconnect(); |
Leider weiß ich jetzt nicht, wie ich die gezippte Datei in den StdIn des Servers bekomme. Der Binärstrom der Datei muss irgendwie zum StandardIn des Servers weitergeleitet werden, damit ich die entsprechenden Commands ausführen kann.
Ich habe gesehen, dass die DLL mir eine Funktion "CreateShell" bereitstellt, die wie folgt aufgebaut ist:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /// <summary> /// Creates the shell. /// </summary> /// <param name="input">The input.</param> /// <param name="output">The output.</param> /// <param name="extendedOutput">The extended output.</param> /// <param name="terminalName">Name of the terminal.</param> /// <param name="columns">The columns.</param> /// <param name="rows">The rows.</param> /// <param name="width">The width.</param> /// <param name="height">The height.</param> /// <param name="terminalModes">The terminal mode.</param> /// <param name="bufferSize">Size of the internal read buffer.</param> /// <returns> /// Returns a representation of a <see cref="Shell" /> object. /// </returns> public Shell CreateShell(Stream input, Stream output, Stream extendedOutput, string terminalName, uint columns, uint rows, uint width, uint height, IDictionary<TerminalModes, uint> terminalModes, int bufferSize) |
Außerdem gibt es eine weitere Funktion, mit der sich ein ShellStream erzeugen lässtn:
1 2 3 4 5 6 7 8 9 10 11 12 13 | /// <summary> /// Creates the shell stream. /// </summary> /// <param name="terminalName">Name of the terminal.</param> /// <param name="columns">The columns.</param> /// <param name="rows">The rows.</param> /// <param name="width">The width.</param> /// <param name="height">The height.</param> /// <param name="bufferSize">Size of the buffer.</param> /// <returns> /// Reference to Created ShellStream object. /// </returns> public ShellStream CreateShellStream(string terminalName, uint columns, uint rows, uint width, uint height, int bufferSize) |
Ich vermute, dass ich mit diesen Funktionen das StdIn für den Server setzen könnte. Falls mir jemand einen Hinweis geben könnte, ob und wie ich diese Funktionen verwenden könnte, um StdIn zu setzen, wäre ich sehr dankbar!