Linux安全提权:普通用户执行root脚本的sudo与setuid全解析

我是一个在服务器上折腾了七八年的老运维,今天想好好聊聊 Linux 权限管理里一个非常实用、但也经常被搞出安全问题的操作:如何让普通用户安全执行 root 权限的特定脚本。

很多人一遇到“普通用户要执行管理员操作”的需求,第一反应就是给账号加 sudo,甚至直接把用户加进 sudoers 白名单。但这在真实的生产环境里其实是个很危险的做法。我见过不止一次,因为 sudo 权限给得太宽,一条误操作命令直接把线上服务搞挂,或者把系统文件权限改乱。今天这篇文章,我就结合自己踩过的坑,把sudo 规则精确授权、setuid 位、策略执行封装、以及几种安全兜底方案全部拆开讲清楚。不管你是刚入行的运维新人,还是已经带团队的老手,这套思路都值得收藏。

文章会从需求分析开始,讲清楚什么时候该用哪种方案,再给出具体可复制的配置示例,最后把我实际运维中遇到的高频问题排查经验也一并分享出来。内容偏实操,适合对 Linux 用户权限、脚本执行、安全基线有一定基础,但又想更进一步理解“最小权限原则”怎么落地的朋友。

1. 需求拆解:你到底需要哪种“临时提权”

很多朋友一上来就问“怎么让普通用户执行 root 脚本”,但实际需求往往分成好几类。如果需求没拆清楚,后面方案选型就会很混乱。

1.1 四种最常见的真实场景

我在实际工作中遇到过这么几种典型情况,基本覆盖了绝大多数“普通用户需要 root 能力”的需求:

场景 A:运维脚本定期执行。比如每天凌晨要跑一个备份脚本,脚本里需要读取只有 root 能访问的配置文件,或者需要操作系统级别的日志目录。这个脚本是固定的、内容可控的,普通用户不会去改它。

场景 B:业务程序需要特定系统调用。比如某个监控采集程序需要读取其他用户进程的 CPU 内存占用,或者需要绑定低端口。这类程序是编译好的二进制,普通用户直接运行会报权限错误。

场景 C:开发同学需要重启某个服务。团队里开发人员经常需要重启 Web 服务、查看服务状态,但又不应该让他们随意改系统配置、看其他敏感文件。

场景 D:完全不确定脚本内容,只是想让某个用户“能执行管理员操作”。这种情况最危险,也最不建议直接授权。

1.2 选型前必须先想清楚的三件事

在确定技术方案之前,我建议你先问自己三个问题:

第一,脚本内容是否完全可信?如果这个脚本会被普通用户编辑,或者脚本内部会动态拼接命令,那么任何形式的提权都是在给你的系统开门。一旦脚本被注入恶意命令,等于把 root 权限直接交了出去。

第二,提权范围是“单条命令”还是“整套流程”?如果只是执行一个固定的二进制程序,用 sudo 精确到程序路径就够了。如果需要执行一个脚本,但脚本内部又会调用其他命令,那这些被调用的命令也必须在授权范围之内,否则 sudo 会拦截失败。

第三,这个权限是长期有效还是临时借用?长期有效的需求适合 sudoers 精确配置,或者 sudo 封装脚本。临时借用可以考虑一次性授权、或者运维平台临时审批。

提示:任何时候都不要为了图省事,直接把普通用户加入 root 组,或者给一个ALL=(ALL) ALL的 sudo 规则。这基本等于把系统管理员权限复制了一份给业务用户,出了事连审计日志都很难定位。

想清楚这三点之后,下面这些具体方案才有意义。否则你只是把一个危险的权限换了一种危险的给法。

2. 最稳妥的日常方案:sudoers 精确规则授权

sudo 是 Linux 系统自带的提权工具,本身设计得很安全,但前提是你得会用。绝大多数安全问题都是因为规则写得太大、太模糊。

2.1 sudoers 文件应该怎么改

sudo 的配置文件在/etc/sudoers,正规做法是不要直接编辑这个文件,而是用visudo命令。visudo 会在保存前做语法检查,如果格式写错,它会阻止你保存,避免搞出“sudo 全线不可用”的悲剧。

我习惯在/etc/sudoers.d/目录下为不同需求单独建文件。比如给某个运维用户授权重启 Web 服务,我会新建一个/etc/sudoers.d/web-admin,内容如下:

# 允许 user1 以 root 身份,无密码执行 systemctl restart nginx user1 ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

这里解释一下每一段的含义:

  • user1:被授权的用户名。
  • ALL:允许该用户从任何主机登录执行,也可以限制为某个内网 IP,后面我会讲。
  • (root):允许切换到的目标用户身份是 root。
  • NOPASSWD::执行时不需要再输入密码。如果去掉这项,执行时需要输入用户自己的密码,安全性更高一点,但频繁操作时会比较烦。
  • 最后一段:具体允许执行的命令和参数。参数必须写完整,否则 sudo 会按模糊匹配处理,存在被绕过风险。

2.2 脚本授权的两种写法,别用错

如果普通用户需要执行的是一个脚本文件,而不是系统命令,sudoers 的写法就要格外小心。

正确写法(推荐):

user1 ALL=(root) NOPASSWD: /usr/local/bin/backup.sh

这种写法授权的是“执行这个脚本文件本身”。脚本内部调用什么命令,sudo 不会再管。所以前提是脚本内容可信、且普通用户不能编辑它。

错误写法(千万别用):

user1 ALL=(root) NOPASSWD: /bin/sh /usr/local/bin/backup.sh

这种写法的意思是“允许以 root 身份执行/bin/sh,并且参数是 backup.sh”。但问题在于,sudo 对参数的控制非常弱,用户完全可以换成/bin/sh /etc/passwd或者任意其他文件,甚至直接执行/bin/sh进入一个 root shell。等于你把一把万能钥匙给了别人,锁还没换。

2.3 关键参数:command 部分为什么必须写到底

sudoers 的一个核心设计就是“绝对路径 + 完整参数”。我给你举个我真实见过的反面例子。

某团队在 sudoers 里写了这样一行:

dev ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

注意,这里是/usr/bin/systemctl restart nginx,没有通配符,看起来挺安全。但实际上问题不在这一行,而在于 dev 用户还可以执行其他 systemctl 子命令吗?不会,sudo 会拦截。真正的问题出在如果脚本路径写得是/usr/bin/systemctl *,那用户就能执行systemctl stop firewalld、systemctl disable sshd,甚至systemctl reboot。这就不再是“允许重启 Nginx”了,而是“允许管理系统上所有服务”。

所以我的经验是:sudoers 里的命令路径,全部写绝对路径,参数不允许出现通配符,除非你非常清楚自己在做什么。另外建议定期用sudo -l查看当前用户的 sudo 权限,确认实际授权范围。

2.4 限制来源 IP 和登录方式

如果你的服务器有运维跳板机,或者只允许内网访问,那么 sudoers 里最好也把来源地址限制住。例如:

user1 192.168.10.0/24=(root) NOPASSWD: /usr/local/bin/backup.sh

这样即使跳板机被攻破,攻击者也只能从该网段发起提权,至少多了一层限制。

另外,很多系统管理员喜欢给普通用户配置 SSH 密钥登录后,再配合 sudo 使用。我建议普通用户的 SSH 登录尽量禁止 root 直接登录,而是用普通用户登录后,按需使用受限 sudo 执行任务。这样审计日志里能明确看到是谁、在哪台机器、用了哪条 sudo 命令。

3. 让普通用户执行“你自己的脚本”:sudo 策略封装

有时候你需要普通用户执行的不只是一个简单命令,而是你自己写的一整套运维脚本,脚本里有大量逻辑判断、命令调用和日志输出。这种情况下,直接用 sudo 授权脚本本身虽然可行,但审计和管理都不太方便。

我来分享一个更可控的封装思路:把需要提权的操作写成独立脚本,再通过 sudo 只暴露一个“入口 wrapper”,最后在 wrapper 里做二次校验。

3.1 一个典型的“备份提权 wrapper”示例

假设我们要实现:普通用户 user1 可以执行/opt/scripts/backup_system.sh,这个脚本内部会调用tar、rsync、systemctl等命令。

第一步,先写好真正的提权脚本,路径设置为 root 所有:

# /opt/scripts/backup_system.sh #!/bin/bash set -euo pipefail LOG_FILE="/var/log/backup_$(date +%F_%H%M).log" echo "[$(date)] backup start" >> "$LOG_FILE" tar -czf /backup/web.tar.gz /var/www/html rsync -av /backup/ user1@backup-server:/backup/ systemctl reload nginx echo "[$(date)] backup done" >> "$LOG_FILE"

第二步,在 sudoers 里授权这个 wrapper:

user1 ALL=(root) NOPASSWD: /opt/scripts/backup_system.sh

第三步,普通用户执行:

sudo /opt/scripts/backup_system.sh

这样做的好处是:普通用户只能执行这一个入口,无法直接调用内部的 tar、rsync 或 systemctl。即使他临时想看脚本内容也没问题,但没有执行权限去改脚本。我们再把脚本文件权限设置成 root:root,chmod 750,普通用户可以执行但不可写,安全性大大提高。

3.2 脚本内部安全性:不要让命令参数被用户拼接

有人可能会问,如果我在脚本里支持用户传入参数,比如指定备份目录,那 sudo 授权还能安全吗?

答案是:可以,但必须非常小心。最常见的安全漏洞是“参数注入”。例如脚本这么写:

#!/bin/bash tar -czf /backup/web.tar.gz "$1"

用户执行:

sudo /opt/scripts/backup_system.sh "/var/www/html; rm -rf /"

如果脚本里没有对参数做校验,就会出现灾难。

我的建议是:对于底层脚本,尽可能不接收用户原始输入。如果必须接收,也要做严格的白名单校验,比如只允许目录路径位于某个固定前缀下,并且过滤掉所有特殊字符。具体可以用正则匹配:

if [[ "$1" =~ ^/var/www/[a-zA-Z0-9_/-]+$ ]]; then : else echo "invalid path" >&2 exit 1 fi

3.3 为什么我强烈建议“普通用户不可写脚本”

很多人为了图方便,把提权脚本放到用户家目录,或者权限设置成了 777。这是大忌。

试想一下:如果普通用户可以修改这个提权脚本,那他就等于可以修改“以 root 身份运行的逻辑”。他只要在脚本里加一行useradd attacker或者chmod 777 /etc/shadow,下一次执行 sudo 脚本时,就是以 root 权限完成了恶意操作。

所以脚本文件本身必须是 root 拥有,权限至少750,最好700,然后通过 sudo 规则单独授权给指定用户。这样普通用户只有“执行权”,没有“修改权”。

注意:如果你用 sudo 执行的是一个 shell 脚本,sudo 的secure_path配置也要检查一下。/etc/sudoers里默认有secure_path,它决定了 sudo 环境下 PATH 内容。如果脚本内调用的命令路径在默认 PATH 之外,脚本会执行失败或者从用户自定义 PATH 中加载恶意同名命令。建议在脚本开头写死命令绝对路径,或者保持系统默认 PATH。

4. 少用但必须会:setuid 位与辅助工具对比

除了 sudo,Linux 下还有几种可以让普通用户执行特权程序的办法,包括 setuid 位、pkexec、以及通过守护进程调用。它们各自有适用场景,也有明显的坑。

4.1 setuid 位是什么,什么时候能用

setuid 位是一个特殊的文件权限位。当一个可执行文件设置了 setuid 位,那么任何用户执行这个文件时,进程的有效用户 ID 会临时变成文件属主。如果文件属主是 root,普通用户运行它时,这个进程就拥有了 root 权限。

举个例子,/usr/bin/passwd就是典型的 setuid 程序,普通用户能用它修改自己的密码,而修改密码需要写/etc/shadow,普通用户本身没有这个权限。

我们也可以设置自己的脚本:

chmod 4755 /opt/scripts/backup_system.sh

但这里有个大坑:对于 shell 脚本,Linux 内核出于安全考虑在很多发行版上会忽略 setuid 位。也就是说,你给.sh文件设置4755,运行时仍然是以调用者的权限执行的,根本不会生效。只有编译后的二进制程序(比如 C 程序)才能可靠使用 setuid 位。

如果确实要使用 setuid,需要把逻辑写进一个编译好的 C 小工具里,然后把这个工具以 root:root 权限部署。比如:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { setuid(0); system("/opt/scripts/backup_system.sh"); return 0; }

然后编译、设置 root 属主、加 setuid 位:

gcc -o backup_helper backup_helper.c sudo chown root:root backup_helper sudo chmod 4755 backup_helper

这种方式可以用,但审计性不如 sudo。setuid 程序执行时不会像 sudo 那样在/var/log/auth.log里留下谁执行了哪条命令的记录。所以一般情况下,我不会推荐 setuid 作为首选。

4.2 sudo 和 setuid 的对比,到底选谁

从安全性、可维护性、审计能力三个维度看,sudo 完胜 setuid。

对比项sudo 精确规则setuid 程序
审计日志有详细日志基本没有
权限控制粒度可按用户、主机、命令、参数控制只能按文件授权
维护难度改 sudoers 即可需要改源码重新编译
误用风险低(规则写好后)高(容易被恶意利用)
适用场景绝大多数运维管理需求极少场景,比如专用系统工具

我见过有些团队为了追求“不用输入密码”就把核心运维命令封装成 setuid 程序,结果出了问题根本查不到是谁什么时候执行的。后面换成 sudo NOPASSWD,虽然还是不用输密码,但至少日志完整。

4.3 pkexec 和守护进程方案简述

除了 sudo 和 setuid,还有两个方案值得知道。

pkexec是 PolicyKit 的命令行工具。它可以在桌面上弹出授权框,或者根据 polkit 规则允许指定用户执行某条命令。相比 sudo,pkexec 的规则写在/usr/share/polkit-1/actions/和/etc/polkit-1/rules.d/里,配置方式更现代化。但实际运维中,很多服务器没有桌面环境,pkexec 的交互体验不如 sudo 顺滑。

守护进程方案是把需要 root 权限的操作封装成系统服务,普通用户通过调用服务的控制接口来触发。比如可以写一个 root 权限的 systemd service,普通用户只能通过systemctl --user里的某个受限接口提交任务,后台再由代理执行。这种方式最安全、审计最完整,但实现成本也最高。适合企业级运维平台的场景,比如批量发布、日志清理、定期巡检这类高频操作。

5. 实战演示:完整配置一个“普通用户可执行 root 备份脚本”

前面讲了不少理论,现在我来走一遍完整流程。从零开始,把需求变成最终可用的配置,你照着操作就能在自己环境里复现。

5.1 需求定义

我们希望实现以下目标:

  • 普通用户ops可以执行/opt/scripts/db_backup.sh。
  • 该脚本会以 root 权限执行数据库备份、压缩、移动到备份目录。
  • 普通用户不能查看数据库密码文件,不能修改备份脚本。
  • 执行过程需要输入 ops 用户的密码,以增加审计安全。
  • 所有 sudo 调用都能在系统日志中查到。

5.2 环境准备与脚本创建

假设系统是常见的 Linux 发行版,默认带 sudo、bash。

创建脚本目录,并写脚本:

sudo mkdir -p /opt/scripts sudo tee /opt/scripts/db_backup.sh > /dev/null <<'EOF' #!/bin/bash set -euo pipefail BACKUP_DIR="/backup/mysql" DATE=$(date +%F_%H%M) mkdir -p "$BACKUP_DIR" # 这里是模拟备份命令,实际生产环境请使用真实数据库备份工具 tar -czf "$BACKUP_DIR/db_$DATE.tar.gz" /var/lib/mysql find "$BACKUP_DIR" -type f -mtime +7 -delete echo "[$(date)] backup completed: $BACKUP_DIR/db_$DATE.tar.gz" EOF

然后设置属主和权限:

sudo chown root:root /opt/scripts/db_backup.sh sudo chmod 750 /opt/scripts/db_backup.sh

到这一步,普通用户 ops 即使能看到脚本,也无法编辑它。

5.3 创建普通用户并配置 sudo 规则

创建用户 ops,并加入需要的辅助组(比如 ops 可能需要读取某些日志,但这不是必须的):

sudo useradd -m ops sudo passwd ops

然后创建独立的 sudoers 配置文件:

sudo visudo -f /etc/sudoers.d/ops-backup

在打开的编辑器里写入:

ops ALL=(root) /opt/scripts/db_backup.sh

注意我这里没有加 NOPASSWD,意思是执行时需要输入 ops 自己的密码。写入后保存。

验证语法:

sudo visudo -c

如果输出parsed OK,就说明配置没问题。

5.4 普通用户实际操作验证

切换到 ops 用户进行验证:

sudo -u ops -i sudo /opt/scripts/db_backup.sh

第一次会提示输入 ops 的密码,输入后脚本执行。

如果希望验证脚本内部命令是否还需要额外授权,可以在脚本里直接写一个需要 root 权限的操作,比如:

touch /root/test_backup_marker

然后在脚本中执行。当普通用户运行 sudo 脚本时,脚本内部已经是 root 身份,所以这个 touch 也能成功。这就是 sudo 包装脚本的特权传播特性。

如果要查看执行记录,可以查看:

sudo tail -f /var/log/auth.log

或者在使用 journald 的系统上:

journalctl -u sudo -f

你会看到类似ops : TTY=pts/0 ; PWD=/home/ops ; USER=root ; COMMAND=/opt/scripts/db_backup.sh的记录。

提示:如果脚本里有一些命令不在默认 PATH 中,一定要在脚本开头export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",避免 sudo 环境下找不到命令。

5.5 权限收紧:如何避免 ops 看到敏感文件

有些脚本内容本身会包含数据库密码,普通用户一旦可读,就等于泄露。更安全的做法是:将脚本设为仅 root 可读可执行:

sudo chmod 700 /opt/scripts/db_backup.sh

但这样的话,普通用户还能执行吗?答案是:可以,因为 sudo 是以 root 身份执行这个脚本的。sudo 在执行命令前不要求执行者对脚本有读取权限,因为执行者是 root,root 能读取一切文件。

所以,如果普通用户根本不需要了解脚本内容,设置700是最佳选择。这样即使有人查看脚本内容也看不到敏感数据。

6. 常见问题与排查技巧实录

这部分是我真正在日常运维中验证过的内容,很多坑如果不踩一遍,光看文档是发现不了的。

6.1 用户执行时报错:“对不起,用户 xxxx 无权以 root 的身份执行”

这个报错最常见的原因是 sudoers 规则没匹配上。检查几个地方:

  • 用户名是否正确。
  • 命令路径是否完全绝对路径。
  • 是否存在其他更早的 sudoers 规则覆盖。
  • 是否在/etc/sudoers.d/下创建了文件,但文件权限不对。sudoers.d 下的文件必须属主 root,权限440,否则 sudo 会直接忽略,并在日志里提示权限不正确。

修复方式:

sudo chown root:root /etc/sudoers.d/ops-backup sudo chmod 440 /etc/sudoers.d/ops-backup sudo visudo -c

6.2 脚本本身能直接执行,但 sudo 执行时报“找不到命令”

这是因为 sudo 有secure_path,默认可能不含/usr/local/bin或/opt/scripts。两个解决方案:

方案一:脚本内写全绝对路径。比如把tar写成/bin/tar。

方案二:修改 sudoers 的 secure_path。比如在/etc/sudoers里增加:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/scripts"

我更推荐方案一,因为这样脚本不依赖 sudo 环境变量,可移植性更好。

6.3 sudo 执行脚本不生效,状态码 126 或 127

  • 126 通常表示脚本文件没有执行权限。即使 root 能读,但内核要执行一个脚本,解释器必须能找到。检查chmod +x。
  • 127 通常表示解释器不存在,比如脚本第一行写了#!/usr/bin/python3,但系统里没有 python3。用head -1 script.sh检查。

6.4 普通用户执行 sudo 脚本时,脚本内部又调用 sudo 导致死循环

像我前面写的脚本,如果脚本内部有sudo systemctl reload nginx,而脚本本身已经是用 root 身份运行的,那么就会变成“root 用户再 sudo 到 root”,有时候会触发 sudo 的恶意命令拒绝策略。

解决办法很简单:脚本内部不要再写 sudo,因为整个脚本已经运行在 root shell 下。直接写systemctl reload nginx即可。

6.5 怎么临时给某用户一次性授权

如果只是让某用户执行一次特定命令,可以在 sudoers 中临时加一条带时间限制的规则,但 sudo 本身没有“过期时间”功能。更实用的做法是使用运维平台的临时授权接口,或者简单粗暴地在用户执行完命令后马上删除 sudoers 文件。

我个人的习惯是:给 sudoers 文件按用途命名,并备注日期。比如:

ops-temporary-backup-20250101

执行完毕后立即删除:

sudo rm /etc/sudoers.d/ops-temporary-backup-20250101

这样即使有审计,也能清楚看到什么时间段开了什么权限。

6.6 检查当前用户实际拥有哪些 sudo 权限

作为运维人员,我经常需要快速确认某个账号到底能执行什么。方法很简单:

sudo -l -U ops

这会列出所有和 ops 相关的 sudo 规则。如果输出太多,可以针对用户看:

sudo -lU ops

这个命令在排查“为什么用户能执行某条命令”时非常有用,能直接看到最终生效的规则是哪一条。

7. 安全加固:别让授权变成后门

最后再聊几个我踩过的安全细节,这些很容易被忽略,但影响非常大。

7.1 小心 sudo 包装脚本里的“环境变量注入”

脚本如果使用了用户可控的环境变量,比如$PATH、$LD_PRELOAD、$PYTHONPATH,就可能被利用。举个最简单的例子:某脚本执行tar,但通过环境变量把tar指向恶意程序。

解决方法是:在脚本开头重置环境变量,或者至少在sudoers里设置:

Defaults env_reset

大多数发行版默认已经开启 env_reset,但如果你自己改过 sudoers,就要确认没把它关掉。

7.2 sudoers 规则顺序:越早匹配越优先

sudoers 规则是“先匹配先生效”。如果你有一个宽规则写在前面,后面再写细规则也白搭。所以我的建议是:显式的精确规则永远写在最前面,兜底规则写在最后。比如避免写这样的宽规则:

ops ALL=(root) NOPASSWD: /usr/bin/*

这种规则等于开放了整个/usr/bin下所有命令,危害极大。如果你确实需要通配,也要缩小到具体目录和具体不可绕过的二进制。

7.3 审计提醒:定期检查 sudo 日志

我习惯每周花五分钟快速扫一下 auth.log 里的 sudo 记录,重点看有没有异常频率的提权操作。如果发现某账号在凌晨频繁执行 sudo,即使规则看起来没问题,也要排查是不是账号被滥用。

日志查看方法:

sudo grep sudo /var/log/auth.log | tail -100

在 journald 系统上:

journalctl _COMM=sudo --since "7 days ago"

如果不想手动看,也可以简单写个 cron 任务,把 sudo 日志汇总发到运维群。但这块属于扩展内容,今天先不展开。

8. 最后的个人经验

如果你问我这几年在权限管理上最大的体会,我觉得就一句话:权限最小化,绝不是一句口号,而是每一次配置都要落到具体路径、具体参数、具体用户上。

sudo 本身很强大,强大到可以一句话就让你拥有整个系统的权限,也可以强大到只让你执行一个严格校验过的备份脚本。差别就在于你愿不愿意花那几分钟去写清楚规则。

另外还有一个容易被忽视的点:脚本的可维护性和权限管理同样重要。我见过太多团队花大力气把 sudo 规则写得滴水不漏,但提权脚本本身写得一塌糊涂,命令到处用相对路径,变量不校验,出了问题没人敢改。久而久之,这些“安全”的规则就变成了定时炸弹。

所以我的建议是:提权脚本要像生产代码一样对待,版本管理、代码评审、权限控制一个都不能少。这样配合 sudo 精确规则,才能形成一个真正可靠的权限体系。

如果你现在正好有一个“普通用户执行 root 脚本”的需求,我建议你从最小场景开始:先选一台测试机,写一个简单的脚本,按我上面的步骤配置 sudoers,然后用sudo -l -U 用户名验证授权范围,再实际操作一遍。等你把这套流程跑通了,再往生产环境推广。这个顺序能帮你避开绝大多数低级事故。

希望这篇文章能让你少踩几个坑。如果后续有机会,我还会继续分享关于 Linux 权限控制、自动化运维脚本设计、以及安全审计方面的一些实战心得。

相关新闻

小体积快充新赛道:协议芯片集成才是体积缩小的胜负手

小体积快充新赛道:协议芯片集成才是体积缩小的胜负手

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 1:54:35 阅读更多 →
AI芯片软硬件协同设计:算子映射、指令集与编译器适配全解析

AI芯片软硬件协同设计:算子映射、指令集与编译器适配全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 1:54:35 阅读更多 →
浏览器里跑三国杀:noname 网页版上手体验

浏览器里跑三国杀:noname 网页版上手体验

浏览器里跑三国杀&#xff1a;noname 网页版上手体验 【免费下载链接】noname 项目地址: https://gitcode.com/GitHub_Trending/no/noname 周三深夜加班结束&#xff0c;发现手边的备用电脑只装了浏览器&#xff0c;装不了任何客户端&#xff0c;又想在睡前打一局三国杀…

2026/10/21 1:53:35 阅读更多 →

最新新闻

2026年职场必备:小白程序员如何用AI看懂工作,轻松上岸?

2026年职场必备:小白程序员如何用AI看懂工作,轻松上岸?

随着AI能力成为职场基础技能&#xff0c;2026年职场竞争加剧&#xff0c;大量毕业生面临“看不懂工作”的焦虑。文章指出&#xff0c;AI岗位需求激增&#xff0c;但企业更看重员工应用AI解决业务问题的能力。传统求职方式效率低下&#xff0c;而AI求职助手如“求职精灵”能帮助…

2026/10/21 2:33:56 阅读更多 →
Harness工程:大模型之外的一切,才是Agent的真正护城河,小白程序员必看!

Harness工程:大模型之外的一切,才是Agent的真正护城河,小白程序员必看!

本文介绍了Harness工程在构建高效AI Agent中的重要性&#xff0c;强调决定Agent上限的并非模型本身&#xff0c;而是模型周围的系统提示、工具集等工程设施。文章详细阐述了如何通过优化系统提示、设计工具以及进行工具测试来提升Agent的性能&#xff0c;特别指出上下文工程已成…

2026/10/21 2:33:56 阅读更多 →
AIGC 时代,品牌门面会被 AI 拉平吗?——当人人都能“生成“,差异藏在哪儿

AIGC 时代,品牌门面会被 AI 拉平吗?——当人人都能“生成“,差异藏在哪儿

品牌设计 AIGC 前瞻 | 干货知识 深度解析AIGC 把 logo 和图片的生成门槛一路打到了几乎为零。一键出图、几秒一个 logo&#xff0c;看起来人人都能当设计师了。可当"能生成"这件事不再稀缺&#xff0c;品牌的差异&#xff0c;到底还藏在哪儿&#xff1f;AIGC 拉平的…

2026/10/21 2:33:56 阅读更多 →
保姆级教程:Ubuntu20.04 部署 CVAT(Docker)+ Nuclio Serverless自动标注 + YOLOv7

保姆级教程:Ubuntu20.04 部署 CVAT(Docker)+ Nuclio Serverless自动标注 + YOLOv7

保姆级教程:Ubuntu20.04 部署 CVAT(Docker)+ Nuclio Serverless自动标注 + YOLOv7 适用环境:Ubuntu 20.04 LTS、NVIDIA显卡(显存≥4G,推荐≥8G;主机内存≥16G,推荐32G) 功能:CVAT网页标注 + 内置Serverless(Nuclio),GPU运行YOLOv7预训练模型,网页一键Auto annotati…

2026/10/21 2:33:56 阅读更多 →
2026 国产 FPGA 板卡定制怎么选?四维评估模型与实力厂商盘点

2026 国产 FPGA 板卡定制怎么选?四维评估模型与实力厂商盘点

引言&#xff1a;国产化背景下&#xff0c;FPGA 板卡定制进入深水区 进入 2026 年&#xff0c;边缘 AI、工业 4.0、电力电子与通信技术迭代的深入&#xff0c;让 FPGA 板卡定制从 “备选项” 变成了许多研发项目的 “必选项”。一方面&#xff0c;AMD&#xff08;Xilinx&#x…

2026/10/21 2:33:56 阅读更多 →
STM32F2多串口扩展:WK2114驱动实现与避坑指南

STM32F2多串口扩展:WK2114驱动实现与避坑指南

简介&#xff1a;这份资源面向嵌入式开发工程师与STM32学习者&#xff0c;提供WK2114串口扩展芯片的驱动实现&#xff0c;用于解决STM32F2系列微控制器UART接口不足、难以同时与多个外设进行串行通信的问题&#xff0c;适用于物联网设备、工业自动化等需要多路串口通信的场景。…

2026/10/21 2:32:56 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事&#xff1a;AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里&#xff0c;按宣传口径&#xff0c;本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”&#xff0c;而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起&#xff1a;用户到底在追求什么“封号重开”这四个字&#xff0c;放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流&#xff0c;背后是大量的时间和精力成本。正常情况下&#xff0c;没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”&#xff0c;而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时&#xff0c;就意识到&#xff1a;单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →