如何从客户端向服务端daemon传递MAC地址、SSH密钥等参数
实现方案
客户端侧操作
- kiosk生成SSH密钥对后,读取通信网卡的MAC地址,读取命令可使用
cat /sys/class/net/eth0/address,根据实际网卡名称修改对应路径即可 - 构造JSON格式的请求体,结构示例如下:
{ "mac": "aa:bb:cc:dd:ee:ff", "ssh_pubkey": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ..." }
- 用curl发送POST请求到服务端对应端口,命令示例:
curl -X POST -H "Content-Type: application/json" -d '上述JSON内容' http://<用户输入的服务端IP>:8899/register,端口可自行选择未被占用的端口,示例使用8899 - 收到服务端200响应后执行重启流程,若请求超时或报错可重试3-5次,同步提示用户检查服务端IP、网络连通性
服务端侧daemon实现
可根据部署规模选择两种实现方向,均适配你参考的Linux daemon开发框架:
方案1:Python实现(小体量部署,开发效率高)
用Flask写极简注册接口,再封装为daemon通过systemd管理即可,核心代码示例:
from flask import Flask, request import os app = Flask(__name__) # 提前创建该目录,给daemon运行用户开放读写权限 CONFIG_STORE = "/opt/kiosk_configs/" @app.route('/register', methods=['POST']) def register(): data = request.get_json() mac = data.get('mac') pubkey = data.get('ssh_pubkey') if not mac or not pubkey: return "Missing parameters", 400 # 替换MAC中的冒号避免文件名非法 mac_safe = mac.replace(':', '_') # 存储SSH公钥 with open(os.path.join(CONFIG_STORE, f"{mac_safe}.pub"), 'w') as f: f.write(pubkey) # 此处插入你自己的MAC对应配置生成逻辑 return "OK", 200 if __name__ == '__main__': app.run(host='0.0.0.0', port=8899, debug=False)
systemd服务配置示例,路径为 /etc/systemd/system/kiosk-register.service:
[Unit] Description=Kiosk Register Daemon After=network.target [Service] Type=simple User=root ExecStart=/usr/bin/python3 /opt/kiosk-register/app.py Restart=always [Install] WantedBy=multi-user.target
启动命令:systemctl daemon-reload && systemctl enable --now kiosk-register.service,同步放开防火墙对应端口即可。
方案2:C语言实现(大规模部署,性能更高)
基于传统Linux daemon框架开发,核心是TCP套接字监听逻辑,代码片段示例:
int sockfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in serv_addr; bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(8899); bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); listen(sockfd, 5); while(1) { int newsockfd = accept(sockfd, NULL, NULL); if (fork() == 0) { close(sockfd); char buffer[4096]; bzero(buffer, 4096); read(newsockfd, buffer, 4095); // 此处插入请求解析、MAC/公钥存储、配置生成逻辑 write(newsockfd, "HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\nOK", 39); close(newsockfd); exit(0); } close(newsockfd); }
安全注意事项
- 注册接口仅开放公钥、MAC存储权限,不关联其他系统操作
- 可配置防火墙规则,仅允许本地网段IP调用注册接口,避免恶意请求
- 收到的SSH公钥需做格式校验,避免非法内容写入系统
内容的提问来源于stack exchange,提问作者Loudest
相关产品推荐
相关产品推荐

