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. JSON-RPC 2.0 over MQTT
  26. ┌──────────────▼─────────────┐
  27. │ Shell Server │
  28. │ │
  29. │ Executor (session级) │
  30. │ ├─ cwd │
  31. │ ├─ Exec(cmd) │
  32. │ ├─ Interrupt() │
  33. │ │
  34. │ process group (pgid) │
  35. │ └─ kill(-pgid, SIGINT) │
  36. └────────────────────────────┘
  37. 6,执行流程图:
  38. ┌──────────────────────────────────────────┐
  39. │ Remote Client │
  40. │ (Web / App / CLI 运维平台) │
  41. └───────────────┬──────────────────────────┘
  42. │ JSON-RPC 2.0
  43. | - executor.ping
  44. │ - executor.exec
  45. │ - executor.interrupt
  46. │ - executor.close
  47. v
  48. ┌──────────────────────────────────────────┐
  49. │ MQTT Broker │
  50. │ (QoS1 / KeepAlive / Reconnect) │
  51. └───────────────┬──────────────────────────┘
  52. │ MQTT Message
  53. │ Topic: /yfkj/device/rpc/{imei}/cmd
  54. v
  55. ┌──────────────────────────────────────────┐
  56. │ sshd / MQTTCoupler │
  57. │ │
  58. │ Transport & RPC Adapter Layer │
  59. │ --------------------------------------- │
  60. │ - MQTT 连接管理 │
  61. │ - JSON-RPC 解析 / 校验 │
  62. │ - 方法分发 (Method Dispatch) │
  63. │ │
  64. └───────────────┬──────────────────────────┘
  65. │ 串行 / 单 Session
  66. v
  67. ┌──────────────────────────────────────────┐
  68. │ shell.Executor │
  69. │ │
  70. │ Session State Layer (≈ SSH Session) │
  71. │ --------------------------------------- │
  72. │ State: │
  73. │ - cwd : 当前工作目录 │
  74. │ - pg : 当前前台进程组 │
  75. │ │
  76. │ Built-in Commands │
  77. │ --------------------------------------- │
  78. │ - cd │
  79. │ - pwd │
  80. │ │
  81. │ Control Interface │
  82. │ --------------------------------------- │
  83. │ Exec() : 启动命令 │
  84. │ Interrupt() : Ctrl+C (SIGINT) │
  85. │ │
  86. └───────────────┬──────────────────────────┘
  87. │ 单次命令执行
  88. v
  89. ┌──────────────────────────────────────────┐
  90. │ executeInternal │
  91. │ │
  92. │ Process Lifecycle Layer │
  93. │ --------------------------------------- │
  94. │ - fork/exec │
  95. │ - 新进程组 (setpgid) │
  96. │ - stdout / stderr 限流 │
  97. │ - 超时控制 (context timeout) │
  98. │ - SIGTERM → SIGKILL │
  99. │ │
  100. └───────────────┬──────────────────────────┘
  101. │ MQTT Message
  102. | Topic: /yfkj/device/rpc/{imei}/ack
  103. v
  104. ┌──────────────────────────────────────────┐
  105. │ Linux Kernel │
  106. │ │
  107. │ - Process Group │
  108. │ - Signal Delivery │
  109. │ - Exit Status │
  110. └──────────────────────────────────────────┘
  111. 8, 取消流程图:Ctrl+C
  112. Remote Client
  113. │ shell.execute
  114. v
  115. ┌───────────────┐
  116. │ sshd │
  117. └──────┬────────┘
  118. v
  119. ┌───────────────────────────┐
  120. │ shell.Executor │
  121. │ │
  122. │ Exec(): │
  123. │ - 设置 p.Dir = cwd │
  124. │ - 注册前台进程组 pg │
  125. │ │
  126. └──────┬────────────────────┘
  127. v
  128. ┌───────────────────────────┐
  129. │ executeInternal │
  130. │ │
  131. │ - Start cmd │
  132. │ - setpgid │
  133. │ - onStart(pg) │◄──────┐
  134. │ │ │
  135. │ - wait / timeout │ │
  136. └──────┬────────────────────┘ │
  137. │ │
  138. v │
  139. Command Running │
  140. Remote Client Ctrl+C │
  141. │ │
  142. │ shell.interrupt │
  143. v │
  144. ┌───────────────┐ │
  145. │ sshd │ │
  146. └──────┬────────┘ │
  147. │ │
  148. v │
  149. ┌───────────────────────────┐ │
  150. │ Executor.Interrupt() │ │
  151. │ → SIGINT to -pgid │───────┘
  152. └───────────────────────────┘