在 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
关键注意事项
- 权限最小化:
- 若仅需 CAN 权限,优先用方式 4(
setcap),避免完整 root; - 若需修改系统接口 / 加载模块,必须用 root(方式 1/2/3)。
- 若仅需 CAN 权限,优先用方式 4(
- 脚本路径:systemd 服务中必须用绝对路径(如
/opt/can_start.sh),不能用相对路径。 - 错误排查:
- 服务启动失败:
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。
1万+

被折叠的 条评论
为什么被折叠?



