应该是怎么需要visudo去编辑把ota_manager.service引入进去的

你说得对!为了让 ota_manager.py(以 cat 用户身份运行)能够启动和停止 ota_http_server.service(以及其他 ROS 服务),我们需要在 sudoers 配置中明确授予 cat 用户执行这些特定 systemctl 命令的权限,并且是无需密码 (NOPASSWD) 的。

使用 visudo 编辑 sudoers 配置(推荐且安全的方式):

  1. 打开 visudo 编辑器:

    bash 复制代码
    sudo visudo

    这会使用系统默认的文本编辑器(通常是 nano 或 vim)打开一个临时文件进行编辑。visudo 会在保存时检查语法,防止你搞坏 sudo

  2. 添加权限规则: 在文件的末尾(或者用户权限规则部分),添加以下行。注意: 每一行对应一个允许的操作。你需要为每个服务添加 startstop 的权限。

    sudoers 复制代码
    # Allow cat user to start/stop specific services without a password for OTA management
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start ota_http_server.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop ota_http_server.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start camera_processor_launch.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop camera_processor_launch.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start ot_agent_launch.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop ot_agent_launch.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start ogger_launch.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop ogger_launch.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start le_reader_launch.service
    cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop le_reader_launch.service
    • cat: 指定哪个用户。
    • ALL=: 表示允许从任何主机执行。
    • (ALL): 表示允许以任何用户身份运行命令(通常是 root)。
    • NOPASSWD:: 表示执行后面的命令时不需要输入密码。
    • /usr/bin/systemctl start <service_name> : 明确指定允许执行的命令及其参数。使用 systemctl 的绝对路径 (/usr/bin/systemctlwhich systemctl 的输出) 很重要!
  3. 保存并退出:

    • Nano 编辑器:Ctrl+X,然后按 Y 确认保存,再按 Enter 确认文件名。
    • Vim 编辑器:Esc,然后输入 :wq,再按 Enter

    visudo 会在你保存时检查语法。如果有错误,它会提示你,不允许你保存错误的配置。

替代方案:使用 /etc/sudoers.d/ 目录(更推荐,更易管理)

创建一个单独的文件来存放你的 OTA 相关权限规则,这样更容易管理,并且不容易影响主 /etc/sudoers 文件。

bash 复制代码
# (需要 root 权限)

# 1. 创建并编辑新文件 (文件名不重要,但最好有意义)
sudo visudo -f /etc/sudoers.d/ota_manager_permissions

# 2. 在打开的编辑器中,粘贴以下内容:
# Allow cat user to start/stop specific services without password for OTA management
cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start http_server.service
cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop _server.service
cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start amera_processor_launch.service
cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl stop camera_processor_launch.service
cat ALL=(ALL) NOPASSWD: /usr/bin/systemctl start bot_agent_launch.service


# 3. 保存并退出编辑器。

# 4. (重要)设置正确的文件权限,否则 sudo 会忽略它!
sudo chmod 440 /etc/sudoers.d/ota_manager_permissions

echo "Sudoers rule created in /etc/sudoers.d/ota_manager_permissions"

完成以上配置后:

  1. 重启 ota_manager.service

    bash 复制代码
    sudo systemctl restart ota_manager.service
  2. 检查日志: 查看 journalctl -u ota_manager.service~/ota_workspace/logs/ota_manager.log。这次 run_systemctl 函数调用 sudo systemctl ... 时应该不会再有 PAM 认证失败的错误了,服务应该能被成功启动和停止。

  3. 测试 HTTP 服务自启动:

    bash 复制代码
    # (确保 manager 服务正在运行)
    sudo systemctl stop ota_http_server.service # 手动停止 HTTP 服务
    sleep 2
    sudo systemctl restart ota_manager.service # 重启 Manager
    sleep 5 # 等待 manager 启动并检查
    sudo systemctl status ota_http_server.service --no-pager # 确认 HTTP 服务被 Manager 重新启动了
    sudo netstat -tulnp | grep ':5000' # 确认端口监听

这样配置后,ota_manager.py(以 cat 用户运行)就获得了控制这些特定服务的必要权限,并且整个流程都运行在更低的用户权限下,更加安全。

相关推荐
lee_curry8 小时前
AI Agent 工程师完整学习路线(面向生产级项目与面试)
人工智能·学习·ai·面试·agent
江湖十年8 小时前
在 Go 中使用 dyno 包处理动态对象
后端·面试·go
数智启示录9 小时前
PostgreSQL 内存调优实战(第 12 篇):work_mem 只调大 64 倍,峰值为什么远不止 64 倍
运维·数据库·经验分享·postgresql·面试
刀法如飞12 小时前
《理解道德经》简版第5章:天地不仁,以万物为刍狗
面试·机器人
wuyk55512 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
数智启示录15 小时前
PostgreSQL 执行计划实战(第 9 篇):SQL 和索引没变,计划为什么突然慢一百倍
数据库·经验分享·sql·postgresql·面试
数智启示录15 小时前
Apache Kafka Consumer 扩到 40 个仍不提速:Partition 上限锁死有效并行度 【Kafka合集】
数据库·经验分享·分布式·缓存·面试·kafka·apache
数智启示录16 小时前
Apache Kafka 幂等 Producer 的边界:Exactly-Once 到了 MySQL 为什么失效 【Kafka合集】
数据库·经验分享·分布式·mysql·面试·kafka·apache
CoderYanger16 小时前
A.每日一题:3622. 判断整除性
java·程序人生·算法·leetcode·面试·职场和发展·蓝桥杯
数智启示录16 小时前
Apache Kafka 不只是消息队列:日志与 Offset 分离如何让事件可重放 【Kafka合集】
经验分享·分布式·面试·kafka·apache