ubuntuusers.de

StdIn über SSH an Server-Anwendung weiterleiten

Status: Ungelöst | Ubuntu-Version: Ubuntu 13.10 (Saucy Salamander)
Antworten |

beachi86

Anmeldungsdatum:
9. Oktober 2013

Beiträge: Zähle...

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!

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

Windows und ssh ist jetzt nicht mein "Ding" erst recht nicht C# ... aber wenn es dir bereits gelungen ist, ein ls abzusetzen und dessen Ergebnis auszulesen, dann denke ich, ist auch der stdin in deiner DLL genauso implementiert.

Will sagen, dein COmmand auf der Remote-Seite ist als Aufruf zu formulieren, der von stdin liest - in deinem Fall wohl einfach der Proagrammname. Im Prinzip also das Stück nach dem Pipe-Symbol.

Wenn ein Programm von stdin liest, dann hängt es solange, bis der Kram über den kanal angeschwappt kommt. M.E. musst du nichts machen. Deine DLL wird vermutlich irgendwo (mit dem Connect?) dann ein Objekt anbieten, das dir eine Ausgabe ermöglicht - es hat dir ja auch ein cmdResult angeboten, um die Ausgabe zu lesen ?

Ich könnte mir vorstellen, dass das explizite Erzeugen eines "Shell-Streams" in einem Standard-Fall gar nicht nötig ist.

Antworten |