readme.txt 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. 借助MQTT实现远程控制Linux设备的SSH服务端和客户端
  2. 作者:niujiuru 日期:2026-01-20
  3. 1, 整体使用JSONRPC2.0 OVER MQTT的技术方案来架构
  4. 2,服务端使用:
  5. - 在具体的项目代码中调用该模块的: “ModuleInit()” 函数启动初始化、安装和运行
  6. - 在具体的项目代码中调用该模块的: “ModuleExit()” 函数完成退出、停止服务运行
  7. 3,服务端原理:
  8. - 服务端启动时,会连接到MQTT Broker,订阅主题:/yfkj/device/rpc/imei/cmd,接收来自客户端的指令
  9. - 服务端启动时,会连接到MQTT Broker,发布主题:/yfkj/device/rpc/imei/ack,向客户端发送指令结果
  10. 4,客户端使用:
  11. - 会编译生成可执行程序“yfkj_ssh_client”,目前支持Linux64和Windows64上位机
  12. - 通过配置文件配置MQTT Broker的地址、用户名、密码以及一些耗时命令的超时时间
  13. 5,客户端原理:
  14. - 客户端启动时,会连接到MQTT Broker,发布主题:/yfkj/device/rpc/imei/cmd,向服务端发送指令请求
  15. - 客户端启动时,会连接到MQTT Broker,订阅主题:/yfkj/device/rpc/imei/ack,接收服务端的指令结果
  16. 6,总体架构图:
  17. ┌────────────────────────────┐
  18. │ Shell Client │
  19. │ │
  20. │ stdin ──> JSON-RPC call │
  21. │ Ctrl+C ─> JSON-RPC notify │
  22. │ │
  23. │ prompt 显示 cwd │
  24. └──────────────┬─────────────┘
  25. │
  26. JSON-RPC 2.0 over MQTT
  27. │
  28. ┌──────────────▼─────────────┐
  29. │ Shell Server │
  30. │ │
  31. │ Executor (session级) │
  32. │ ├─ cwd │
  33. │ ├─ Exec(cmd) │
  34. │ ├─ Interrupt() │
  35. │ │
  36. │ process group (pgid) │
  37. │ └─ kill(-pgid, SIGINT) │
  38. └────────────────────────────┘
  39. 6,执行流程图:
  40. ┌──────────────────────────────────────────┐
  41. │ Remote Client │
  42. │ (Web / App / CLI 运维平台) │
  43. └───────────────┬──────────────────────────┘
  44. │ JSON-RPC 2.0
  45. | - executor.ping
  46. │ - executor.exec
  47. │ - executor.interrupt
  48. │ - executor.close
  49. v
  50. ┌──────────────────────────────────────────┐
  51. │ MQTT Broker │
  52. │ (QoS1 / KeepAlive / Reconnect) │
  53. └───────────────┬──────────────────────────┘
  54. │ MQTT Message
  55. │ Topic: /yfkj/device/rpc/{imei}/cmd
  56. v
  57. ┌──────────────────────────────────────────┐
  58. │ sshd / MQTTCoupler │
  59. │ │
  60. │ Transport & RPC Adapter Layer │
  61. │ --------------------------------------- │
  62. │ - MQTT 连接管理 │
  63. │ - JSON-RPC 解析 / 校验 │
  64. │ - 方法分发 (Method Dispatch) │
  65. │ │
  66. └───────────────┬──────────────────────────┘
  67. │ 串行 / 单 Session
  68. v
  69. ┌──────────────────────────────────────────┐
  70. │ shell.Executor │
  71. │ │
  72. │ Session State Layer (≈ SSH Session) │
  73. │ --------------------------------------- │
  74. │ State: │
  75. │ - cwd : 当前工作目录 │
  76. │ - pg : 当前前台进程组 │
  77. │ │
  78. │ Built-in Commands │
  79. │ --------------------------------------- │
  80. │ - cd │
  81. │ - pwd │
  82. │ │
  83. │ Control Interface │
  84. │ --------------------------------------- │
  85. │ Exec() : 启动命令 │
  86. │ Interrupt() : Ctrl+C (SIGINT) │
  87. │ │
  88. └───────────────┬──────────────────────────┘
  89. │ 单次命令执行
  90. v
  91. ┌──────────────────────────────────────────┐
  92. │ executeInternal │
  93. │ │
  94. │ Process Lifecycle Layer │
  95. │ --------------------------------------- │
  96. │ - fork/exec │
  97. │ - 新进程组 (setpgid) │
  98. │ - stdout / stderr 限流 │
  99. │ - 超时控制 (context timeout) │
  100. │ - SIGTERM → SIGKILL │
  101. │ │
  102. └───────────────┬──────────────────────────┘
  103. │ MQTT Message
  104. | Topic: /yfkj/device/rpc/{imei}/ack
  105. v
  106. ┌──────────────────────────────────────────┐
  107. │ Linux Kernel │
  108. │ │
  109. │ - Process Group │
  110. │ - Signal Delivery │
  111. │ - Exit Status │
  112. └──────────────────────────────────────────┘
  113. 8, 取消流程图:Ctrl+C
  114. Remote Client
  115. │
  116. │ shell.execute
  117. v
  118. ┌───────────────┐
  119. │ sshd │
  120. └──────┬────────┘
  121. │
  122. v
  123. ┌───────────────────────────┐
  124. │ shell.Executor │
  125. │ │
  126. │ Exec(): │
  127. │ - 设置 p.Dir = cwd │
  128. │ - 注册前台进程组 pg │
  129. │ │
  130. └──────┬────────────────────┘
  131. │
  132. v
  133. ┌───────────────────────────┐
  134. │ executeInternal │
  135. │ │
  136. │ - Start cmd │
  137. │ - setpgid │
  138. │ - onStart(pg) │◄──────┐
  139. │ │ │
  140. │ - wait / timeout │ │
  141. └──────┬────────────────────┘ │
  142. │ │
  143. v │
  144. Command Running │
  145. │
  146. Remote Client Ctrl+C │
  147. │ │
  148. │ shell.interrupt │
  149. v │
  150. ┌───────────────┐ │
  151. │ sshd │ │
  152. └──────┬────────┘ │
  153. │ │
  154. v │
  155. ┌───────────────────────────┐ │
  156. │ Executor.Interrupt() │ │
  157. │ → SIGINT to -pgid │───────┘
  158. └───────────────────────────┘