You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从客户端向服务端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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:15:05