readme.txt 7.5 KB

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