脚本启动CAN

在 Ubuntu 系统中,要让脚本 / 程序启动时自动获得 root 权限,核心有 3 种实现方式(按易用性 / 场景优先级排序):

方式 1:sudo 直接启动脚本(最简单,手动执行)

适用于手动启动脚本的场景,直接通过sudo赋予 root 权限,无需修改脚本本身。

示例脚本(can_start.sh

bash

运行

#!/bin/bash
# 功能:初始化CAN接口 + 启动CAN程序
set -e  # 出错立即退出

# 1. 加载CAN内核模块
modprobe can
modprobe can_raw
modprobe vcan

# 2. 配置CAN0接口(虚拟CAN,物理CAN替换为bitrate配置)
ip link add dev can0 type vcan
ip link set up can0

# 3. 启动CAN程序(假设程序路径为/opt/can_demo)
/opt/can_demo

# 4. 输出日志
echo "CAN服务已启动(root权限)"
赋予脚本执行权限

bash

运行

chmod +x can_start.sh
用 root 权限启动

bash

运行

sudo ./can_start.sh

方式 2:系统服务(systemd)+ User=root(开机自启 / 后台运行)

适用于开机自启、后台运行的场景,通过systemd服务文件指定root用户运行,无需手动输入 sudo 密码。

步骤 1:编写 systemd 服务文件(/etc/systemd/system/can_service.service

ini

[Unit]
Description=CAN Bus Service (root权限)
After=network.target  # 网络启动后再执行(非必需,CAN无网络依赖可删)

[Service]
Type=simple
User=root  # 强制以root用户运行
Group=root
ExecStart=/opt/can_start.sh  # 脚本绝对路径
Restart=on-failure  # 程序崩溃时自动重启
RestartSec=3  # 重启间隔3秒
StandardOutput=journal+console  # 日志输出到系统日志

[Install]
WantedBy=multi-user.target  # 多用户模式开机自启
步骤 2:将脚本放到指定路径并赋予执行权限

bash

运行

# 假设脚本路径为/opt/can_start.sh
sudo mv can_start.sh /opt/
sudo chmod +x /opt/can_start.sh
步骤 3:启用并启动服务

bash

运行

# 重新加载systemd配置
sudo systemctl daemon-reload

# 开机自启
sudo systemctl enable can_service.service

# 启动服务
sudo systemctl start can_service.service

# 查看状态(确认是否正常运行)
sudo systemctl status can_service.service
日志查看

bash

运行

sudo journalctl -u can_service.service -f  # 实时查看日志

方式 3:脚本内自动提权(无需手动加 sudo)

适用于用户忘记加 sudo 时,脚本自动请求 root 权限的场景,通过id判断当前用户,非 root 则重新以 sudo 执行。

改造后的脚本(can_start_auto_sudo.sh

bash

运行

#!/bin/bash
set -e

# ========== 核心:自动提权逻辑 ==========
if [ "$(id -u)" -ne 0 ]; then
    # 非root用户,重新以sudo执行本脚本
    echo "请输入root密码以提权..."
    sudo "$0" "$@"  # "$0"是脚本自身路径,"$@"传递所有参数
    exit $?  # 执行完后退出原进程
fi
# =======================================

# 以下为原脚本逻辑(已获得root权限)
echo "当前用户:$(whoami)(root权限)"

# 1. 加载CAN模块
modprobe can
modprobe can_raw
modprobe vcan

# 2. 配置CAN0
ip link add dev can0 type vcan
ip link set up can0

# 3. 启动CAN程序
/opt/can_demo

echo "CAN服务启动完成"
使用方式

直接执行脚本,无需手动加 sudo,脚本会自动请求 root 密码:

bash

运行

chmod +x can_start_auto_sudo.sh
./can_start_auto_sudo.sh  # 自动弹出密码输入提示

方式 4:给程序添加 CAP_NET_RAW 能力(无需 root 但拥有 CAN 权限)

若仅需 CAN RAW Socket 权限(无需完整 root),可给程序添加 Linux 能力,避免以 root 运行(更安全)。

适用场景

程序仅需要创建 CAN RAW Socket,无需其他 root 操作(如修改系统接口、加载模块)。

操作命令

bash

运行

# 给CAN程序添加CAP_NET_RAW能力
sudo setcap cap_net_raw+ep /opt/can_demo

# 之后直接运行程序即可(无需sudo)
/opt/can_demo

关键注意事项

  1. 权限最小化
    • 若仅需 CAN 权限,优先用方式 4(setcap),避免完整 root;
    • 若需修改系统接口 / 加载模块,必须用 root(方式 1/2/3)。
  2. 脚本路径:systemd 服务中必须用绝对路径(如/opt/can_start.sh),不能用相对路径。
  3. 错误排查
    • 服务启动失败:sudo systemctl status can_service.service
    • CAN 接口配置失败:检查ip link show can0是否存在,或模块是否加载(lsmod | grep can)。

总结

方式适用场景优点缺点
sudo 脚本手动临时启动简单、无需配置每次需输密码、无法自启
systemd 服务开机自启、后台运行稳定、自动重启、日志完善配置稍复杂
脚本内自动提权避免用户忘记加 sudo易用、无需记忆 sudo仍需输密码
setcap 能力仅需 CAN 权限(无其他 root 操作)安全(非完整 root)仅适用于程序,不适用于脚本

优先推荐:开机自启用方式 2,手动启启用方式 1/3,仅 CAN 权限用方式 4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值