Linux sudo 命令新手使用手册

Anson 教程 221 次浏览 抢沙发

sudo 是新手接触 Linux 系统需要掌握的基本命令。学会使用 sudo 可以帮助我们养成良好习惯,避免平时用 root 管理员帐号所带来的潜在风险,同时方便在共享机器时可以控制用户权限。

本文以新手视角简明介绍 sudo 基础用法和常用配置。

sudo 简介

sudo 是 Linux 和其它类 Unix 操作系统下的权限授予管理程序。它允许已授权用户(或用户组)在需要时以 root 或其它用户权限运行命令,并且具有灵活可扩展和能够审查用户活动的特性。

以下是 sudo 和另一个提权命令 su 之间的主要区别。

su 命令 sudo 命令
需要使用 root 密码验证 验证用户密码而无需 root 密码
切换到 root 不能控制权限 通过命令提权而非切换 root shell,可控制权限
切换到 root 后需主动退出 临时授权机制,超过时间需重新验证
难以审查用户活动记录 记录用户活动日志,可创建自定义警报

sudo 安装

sudo 通常作为基础软件被内置安装在系统中,可以用下面命令检查和安装 sudo

检查是否已安装 sudo 安装 sudo
RHEL & CentOS rpm -q sudo yum -y install sudo
Debian & Ubuntu dpkg -s sudo apt-get -y install sudo

创建用户帐号

如果你正在使用 root 没有其它用户帐号,那么需要先创建一个普通用户帐户。

useradd 用户名 && passwd 用户名

运行命令后会先创建用户帐号,然后按提示设置密码(输入两遍)。

开始使用 sudo

sudo 有个默认用户组,组内用户可以通过 sudo 运行所有命令。如果用户帐号是自己使用的,或者希望拥有运行特权命令的能力,那么将用户添加到该组里就可以使用 sudo 了。

在主流 Linux 发行版中,这个默认用户组名称不尽相同,可以搜索 sudo 配置文件查询。

例如下面是 CentOS 搜索结果,默认用户组是 wheel(Ubuntu & Debian 则是 sudo 用户组)。

[[email protected] ~]# grep ^% /etc/sudoers
%wheel  ALL=(ALL)       ALL

注:如果搜索没有匹配结果,可能配置文件注释掉了用户组参数,需要手动去除注释。

下面是添加用户到对应用户组的命令。

# RHEL & CentOS
usermod -aG wheel 用户名

# Debian & Ubuntu
usermod -aG sudo 用户名

添加后就可以通过 sudo 提权运行命令了。使用方法很简单,在命令前加上 sudo 再运行即可(运行前会要求验证用户密码)。下面是一个使用示例,未加 sudo 前无权限查看 root 用户目录文件。

[[email protected] ~]$ ls -a /root
ls: cannot open directory /root: Permission denied

[[email protected] ~]$ sudo ls -a /root
[sudo] password for anthony: 
.  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .cshrc  .tcshrc

sudo 常用参数

sudo -h 命令可以打印详细参数列表。下面介绍几个经常用到参数。

命令参数 功能作用
sudo -l 查询当前用户拥有的权限,可以运行哪些命令
sudo -u 用户名 命令 以指定用户身份运行命令(如不指定,预设用户身份是 root)
sudo -u 用户名 -H 命令 将 HOME 环境变量设为指定用户的 HOME 环境变量
sudo -E 命令 运行命令时保留当前用户的环境变量
sudo -k 清除密码缓存时间,下次使用 sudo 需重新验证用户密码
sudo -v 延长密码缓存时间 5 分钟

sudo 使用技巧

使用 Shell 内置命令

对于 Shell 内置命令,无法通过 sudo 运行。解決方法是切换到 root shell 再运行。

sudo bash

传递用户命令别名

sudo 会忽略当前用户设置的命令别名,解決方法是在 ~/.bashrc 文件中添加一个 sudo 别名。别名值最后加一个空格,这样 bash 会检查空格后面的命令是否也是别名。

alias sudo='sudo '

快速运行之前命令

新手经常会遇到的问题,不熟悉 Linux 系统操作权限,往往运行命令后提示权限不够才想起要用 sudo。每次这样重新输入命令很麻烦,下面用法会省事的多。

# 运行上一个命令
sudo !!

# 运行历史记录里第 3 个命令
sudo !3

一次运行多个命令

sudo 运行多个命令需要用到 -c 参数,在引号间用 ; 隔开命令。

sudo -- bash -c 'whoami; hostname; date'

sudo 常用配置

sudo 默认安全策略由 /etc/sudoers 配置文件提供,它具有高度可扩展性。譬如设置允许哪些用户(或用户组)使用 sudo,限制只可用哪些命令,是否需要密码验证等,这些都需修改配置文件实现。

注:为避免语法问题,编辑 /etc/sudoers 文件要用下面命令打开。它默认调用 vi 编辑器,会在保存前检查语法是否正确(如果有错误,输入 e 回车返回编辑,或输入 x 不保存退出)。

sudo visudo

介绍几个常用 sudo 配置项,将参数添加到配置文件里使用。如果存在多个相同参数设置,则后面的会覆盖前面的生效。

添加用户或用户组,并控制权限

# 添加 anthony 用户
anthony		ALL=(ALL) 	ALL

# 添加 marilyn 用户组
%marilyn	ALL=(ALL)	ALL

上面示例添加的用户可以通过 sudo 运行所有命令,相当拥有 root 权限。参数解析如下:

  • 第一列信息表示用户或用户组,用户组前面带 % 字符区分;
  • 第二列 ALL 表示允许所有主机名登录的用户执行命令,括号里 ALL 允许以任何用户身份执行命令;
  • 第三列 ALL 表示允许所有命令。

而下面这个是带权限控制的用户添加,它只允许 joseph 用户在 mylaptop 主机名的机器上以 root 身份运行 lskill 命令。

joseph	mylaptop=(root)	/bin/ls,/bin/kill

设置重新验证密码时间

用户使用 sudo 后的 5 分钟内再次使用可以免于密码验证,时间支持自定义设置。

Defaults:用户名 timestamp_timeout=20

例如设置 20 分钟。如果设置为  0,则每次使用 sudo 都需要密码验证。如果设置负数(即小于 0),那么直至下次系统重启前都不用重新验证密码。

对指定用户或命令免密码验证

# 对 anthony 用户免密码
anthony		ALL=(ALL) 	NOPASSWD: ALL

# 对 anthony 用户运行 ls 、kill 命令免密码
anthony		ALL=(ALL) 	NOPASSWD: /bin/ls,/bin/kill

注:当对用户设置免密码验证,那些以该用户身份运行的程序也可以无需密码执行 sudo

发表评论

电邮地址用于 Gravatar 头像显示,不会被公开可见。