EasySshWsModule.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using AspNetTools;
  2. using FxSsh;
  3. using FxSsh.Services;
  4. using MiniTerm;
  5. using System;
  6. using System.Configuration;
  7. using System.IO;
  8. using System.Net;
  9. using System.Net.Sockets;
  10. using System.Reflection;
  11. using System.Web;
  12. namespace WebTerminalServer
  13. {
  14. public class EasySshWsModule : IHttpModule
  15. {
  16. private SshServer _server;
  17. private IPEndPoint _listenEndPoint;
  18. private static void Log(string info)
  19. {
  20. File.AppendAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "logs.log"), info + Environment.NewLine);
  21. }
  22. public void Init(HttpApplication context)
  23. {
  24. Log("SshWsModule Init, OS:" + Environment.OSVersion.ToString());
  25. AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
  26. {
  27. Log(args.ExceptionObject?.ToString());
  28. };
  29. //Create ssh server with available port
  30. _server = new SshServer(new StartingInfo(IPAddress.Loopback, 0, "SSH-2"));
  31. _server.AddHostKey("ssh-rsa", ConfigurationManager.AppSettings["SshHostKey"]);
  32. _server.ConnectionAccepted += (s2, e2) =>
  33. {
  34. e2.ServiceRegistered += (s1, e1) =>
  35. {
  36. if (e1 is UserauthService)
  37. {
  38. var service = (UserauthService)e1;
  39. service.Userauth += (s, e) =>
  40. {
  41. e.Result = true;
  42. };
  43. }
  44. else if (e1 is ConnectionService service)
  45. {
  46. service.EnvReceived += (s, e) => Console.WriteLine("Received environment variable {0}:{1}", e.Name, e.Value); ;
  47. service.CommandOpened += (s, e) =>
  48. {
  49. Console.WriteLine($"Channel {e.Channel.ServerChannelId} runs {e.ShellType}: \"{e.CommandText}\".");
  50. var allow = true; // func(e.ShellType, e.CommandText, e.AttachedUserauthArgs);
  51. if (!allow) return;
  52. if (e.ShellType == "shell")
  53. {
  54. // requirements: Windows 10 RedStone 5, 1809
  55. // also, you can call powershell.exe
  56. Log("Pending Create Terminal");
  57. EasyTerminal terminal = null;
  58. try
  59. {
  60. terminal = new EasyTerminal("cmd.exe");
  61. }
  62. catch (Exception exception)
  63. {
  64. Log(exception.ToString());
  65. return;
  66. }
  67. Log("Terminal Created");
  68. e.Channel.DataReceived += (ss, ee) => terminal.OnInput(ee);
  69. e.Channel.CloseReceived += (ss, ee) => terminal.OnClose();
  70. terminal.DataReceived += (ss, ee) => e.Channel.SendData(ee);
  71. terminal.CloseReceived += (ss, ee) => e.Channel.SendClose(ee);
  72. terminal.Run();
  73. }
  74. };
  75. }
  76. };
  77. };
  78. _server.Start();
  79. var field = _server.GetType().GetField("_listenser", BindingFlags.Instance | BindingFlags.NonPublic);
  80. var listener = (TcpListener)field.GetValue(_server);
  81. _listenEndPoint = (IPEndPoint)listener.Server.LocalEndPoint;
  82. context.PostMapRequestHandler += delegate
  83. {
  84. WebSocketForwardModule.ForwardCurrentContext("est", ConfigurationManager.AppSettings["PassCode"], _listenEndPoint);
  85. };
  86. }
  87. public void Dispose()
  88. {
  89. _server?.Stop();
  90. }
  91. }
  92. }