c# session ssh ssh.net

c# - ¿Es posible ejecutar múltiples comandos SSH desde una sola sesión con SSH.NET?



session (1)

Estoy usando C # con SSH.NET y he podido lograr que una conexión SSH de cliente funcione bien para ejecutar comandos en SSH. Puedo conectarme a una instalación de Linux que tengo en una VM de hipervisor sin problemas, leer StdOut y StdErr, etc.

Sin embargo, cada comando es como una sesión completamente nueva: siempre comienza desde /home/user , incluso si finaliza desde otro directorio con el último comando. Puede encadenar varios comandos junto con punto y coma:

pwd; cd ..; pwd

/home/user /home

pero luego si ejecuto:

pwd

/home/user

Estoy de vuelta en el directorio de inicio para ese usuario.

No estoy desconectando y cerrando la sesión entre los comandos. Aquí hay un código de ejemplo para varios comandos en una fila, usando cambios en la ruta para ilustrar el problema:

public void MultiCommandTest() { string output1, output2; var host = Config.SshHostName; var port = Config.SshHostPort; var user = Config.SshUsername; var pass = Config.SshPassword; var auth = new PasswordAuthenticationMethod(user, pass); var info = new ConnectionInfo(host,port,user,auth); using (var ssh = new SshClient(info)) { ssh.Connect(); var cmd1 = ssh.CreateCommand("pwd; cd ..; pwd"); output1 = cmd1.Execute(); var cmd2 = ssh.CreateCommand("pwd; cd ..; pwd"); output2 = cmd2.Execute(); ssh.Disconnect(); } string output = output1 + Environment.NewLine + output2; System.Windows.Forms.Clipboard.SetText(output); System.Windows.Forms.MessageBox.Show(output); }

Me doy cuenta de que hay una diferencia entre una sesión interactiva y una no interactiva cuando se conecta a Bash, etc., pero no sé lo suficiente sobre Linux, etc., para saber si eso podría ser parte de la solución (es decir, debe ser resuelto en el lado de inicio de sesión con .profile , .bashrc o similar?).

Pregunta:

Entonces, ¿hay alguna manera de tener una conexión similar a un shell con SSH (y SSH.NET en particular)? ¿O solo necesito serializar cualquier conjunto de comandos y enviarlos todos a la vez, siempre comenzando desde cero para cualquier comando nuevo?


Puede implementar una sesión de shell usando:

  • SshClient.CreateShellStream ( clase ShellStream ): le ofrece una interfaz Stream , que puede escribir y leer. Esta interfaz es útil cuando quieres interactuar directamente con el shell.
  • o SshClient.CreateShell ( clase Shell ): donde usted mismo proporciona flujos separados para entrada, salida y salida de error. Esta interfaz es útil cuando desea vincular / canalizar la entrada y la salida a flujos existentes (como entradas y salidas estándar o archivos). Aunque todavía puedes interactuar directamente, si usas PipeStream . Ver también SSH.NET no procesa mis comandos de entrada de shell .

Pero el uso de "shell" no se recomienda para automatizar la ejecución de comandos. Un shell es una característica interactiva, que no tiene un comportamiento determinista.

Es mejor utilizar un canal ejecutivo, consulte Cómo ejecutar comandos en el servidor SSH en C #?