ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Linux命令-sudo(以其他用户身份执行命令)

2026/8/12 20:21:55 拓冰建站 浏览量
Linux命令-sudo(以其他用户身份执行命令) Linux命令-sudo以其他用户身份执行命令快速参考基本用法常用选项Sudoers 配置sudoers 语法实用配置示例安全审计sudo vs su常见问题sudoSuperUser DO是 Linux 系统中默认的权限提权工具允许授权用户以 root 或其他用户的身份执行命令。它是系统安全策略的执行者通过/etc/sudoers配置文件实现细粒度的权限控制。相比susudo更安全——用户使用自身密码认证所有操作均有审计日志。快速参考sudo[选项]命令[参数...]sudo默认以 root 身份执行命令。通过/etc/sudoers配置可以精确控制谁可以在哪些主机上以哪个用户的身份执行哪些命令。基本用法# 以 root 身份执行命令默认sudoapt-getupdate# 以指定用户身份执行sudo-upostgres psql# 以 root 身份启动登录 Shellsudo-i# 以 root 身份启动指定 Shellsudo-s/bin/bash# 列出当前用户的 sudo 权限sudo-l# 刷新 sudo 时间戳延长免密时间sudo-v# 使 sudo 时间戳过期下次需要密码sudo-k# 编辑文件推荐使用 sudoeditsudo-e/etc/apt/sources.list# 等同于 sudoedit /etc/apt/sources.list# 保留当前 HOME 环境变量sudo-Hcommand# 非交互模式密码从 stdin 读取echomypassword|sudo-Sapt-getupdate# ⚠️ 安全风险密码明文出现在脚本/历史记录中常用选项选项说明-u USER以指定用户身份执行-g GROUP以指定组身份执行-i登录 Shell模拟完整登录-s指定 Shell 运行-l列出当前用户权限-v验证/刷新时间戳-k使时间戳立即失效-b后台运行命令-e编辑文件sudoedit-E保留环境变量-H将 HOME 设为目标用户的家目录-n非交互不提示密码--标记选项结束之后的参数原样传递Sudoers 配置关键警告永远不要直接编辑/etc/sudoers始终使用visudovisudo在保存前会进行语法检查避免因语法错误导致所有 sudo 命令失效。# 编辑主配置文件sudovisudo# 编辑用户特定配置推荐sudovisudo-f/etc/sudoers.d/webadminssudoers 语法# 基本格式用户 主机(以谁的身份) 命令 # 用户 主机 (运行身份) 命令列表 root ALL (ALL) ALL admin ALL (ALL) ALL # 组授权% 前缀表示组 %sudo ALL (ALL) ALL %wheel ALL (ALL) ALL # 无需密码执行 deploy ALL (ALL) NOPASSWD: /usr/bin/systemctl restart nginx # 限制可执行的命令 operator ALL (root) /usr/bin/systemctl, /usr/bin/journalctl # 仅允许以特定用户执行 app ALL (www-data) /usr/bin/php, /usr/local/bin/composer # 命令别名 Cmnd_Alias SERVICES /usr/bin/systemctl restart *, /usr/bin/systemctl stop * Cmnd_Alias PKG_MGMT /usr/bin/apt-get, /usr/bin/apt webadmin ALL (root) SERVICES, PKG_MGMT # 禁止危险命令! 取反 joe ALL (ALL) ALL, !/usr/bin/su, !/usr/bin/passwd root # 要求 tty避免后台脚本注入 sudo Defaults requiretty # 日志记录 Defaults logfile/var/log/sudo.log # 设置 sudo 密码超时分钟 Defaults timestamp_timeout15 # 密码尝试次数 Defaults passwd_tries3 # 防止配置被下级目录覆盖 Defaults !includedir实用配置示例# 开发团队配置cat/etc/sudoers.d/developersEOF # 允许开发团队重启服务 %developers ALL(root) NOPASSWD: /usr/bin/systemctl restart nginx %developers ALL(root) NOPASSWD: /usr/bin/systemctl restart php*-fpm %developers ALL(root) NOPASSWD: /usr/bin/systemctl restart redis # 允许查看日志 %developers ALL(root) /usr/bin/journalctl, /usr/bin/tail # 不允许切换到 root %developers ALL(ALL) ALL, !/usr/bin/su -, !/usr/bin/su root EOF# 数据库管理员配置cat/etc/sudoers.d/dbaEOF # DBA 以 postgres/mysql 用户操作数据库 %dba ALL(postgres) NOPASSWD: /usr/bin/psql, /usr/bin/pg_dump, /usr/bin/pg_restore %dba ALL(mysql) NOPASSWD: /usr/bin/mysql, /usr/bin/mysqldump EOF# CI/CD 部署用户配置cat/etc/sudoers.d/cicdEOF # 部署用户只能执行部署相关操作 deploy ALL(root) NOPASSWD: /usr/bin/systemctl restart app-server deploy ALL(root) NOPASSWD: /usr/local/bin/deploy.sh deploy ALL(root) NOPASSWD: /bin/chown -R www-data\:www-data /var/www/* Defaults:deploy !requiretty EOF安全审计# 查看 sudo 执行日志sudogrepsudo/var/log/auth.logsudogrepsudo/var/log/secure# RHEL/CentOS# 自定义 sudo 日志位置# 在 /etc/sudoers 中添加Defaultslogfile/var/log/sudo.log# 查看最近的 sudo 操作tail-f/var/log/auth.log|grepsudo# 审计用户 sudo 行为cat/var/log/auth.log|grepCOMMAND|awk{print $NF}|sort|uniq-c|sort-rn# 查看谁在使用 sudowho-u|awk{print $1}|whilereaduser;doecho$user:$(sudo-l-U$user21)donesudo vs su特性sudosu密码要求自身密码目标用户密码审计日志详细每条命令仅记录切换权限粒度精确到命令全部或没有密码共享无需需要时间控制支持超时无配置文件/etc/sudoers/etc/pam.d/su推荐场景日常使用救援模式常见问题# 问题 1: xxx is not in the sudoers file# 将用户加入 sudo 组usermod-aGsudousername# Debian/Ubuntuusermod-aGwheel username# RHEL/CentOS# 问题 2: sudo 不要求密码检查配置sudo-l|grepNOPASSWD# 问题 3: sudo 命令未找到环境变量被重置# 在 sudoers 中添加安全路径Defaultssecure_path/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin# 问题 4: visudo 语法错误后恢复# 如果因为错误配置导致 sudo 不可用# 使用 pkexec 或救援模式恢复pkexec visudo# 问题 5: sudo 密码超时设置# 查看当前超时时间sudo-V|grepAuthentication timestamp timeout安全准则原则最小权限——只给用户完成工作所需的最小 sudo 权限禁止NOPASSWD: ALL——这是等同于 root 的无密码访问强制使用visudo编辑 sudoers配置审计日志定期审查 sudo 使用记录为服务用户如 deploy配置精确的命令白名单