1.命令作用
以其他用户执行命令(execute a command as another user);可以临时切换到指定用户进行操作,一般是普通用户使用该命令临时切换到root用户执行命令
2.命令语法
usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p prompt] [-T timeout] [-u user] file ...
3.参数详解
Options:
- -A, --askpass,使用辅助程序进行密码提示
- -b, --background,在后台执行命令
- -C, --close-from=num,关闭所有文件描述符>=num
- -E, --preserve-env,执行命令时,请保留用户环境
- --preserve-env=list,保留特定的环境变量
- -e, --edit,编辑文件而不是运行命令
- -g, --group=group,以指定的组名或组ID执行命令
- -H, --set-home,设置HOME变量为目标用户的HOME目录
- -h, --help,显示帮助信息并退出
- -h, --host=host,在主机上运行命令(如果插件支持)
- -i, --login,以目标用户运行login shell;还可以指定命令
- -K, --remove-timestamp,彻底删除时间戳文件,直接移除存储密码缓存的物理文件
- -k, --reset-timestamp,标记时间戳为失效(不删除文件),仅修改时间戳状态使其立即过期
- -l, --list,列出用户的特权或检查特定的命令;-ll表示较长的格式
- -n, --non-interactive,非交互模式,不使用提示符
- -P, --preserve-groups,打印sudo用户root的用户组信息和执行用户的用户组信息
- -p, --prompt=prompt,使用指定的密码提示符;%h主机名,%u用户名,%%百分号
- -r, --role=role,使用指定的角色创建SELinux安全上下文
- -S, --stdin,从标准输入读取密码,而不是交互方式输入密码
- -s, --shell,以目标用户运行shell;还可以指定命令
- -t, --type=type,使用指定的类型创建SELinux安全上下文
- -T, --command-timeout=timeout,在指定的时间限制后终止命令
- -U, --other-user=user,在列表模式下,显示用户的权限
- -u, --user=user,以指定的用户名或ID运行命令(或编辑文件)
- -V, --version,显示版本信息并退出
- -v, --validate,不使用命令更新用户的时间戳,延长密码有效时间(重置密码有效计时器)
- --,作为sudo与执行命令行的分隔符,避免sudo参数与命令行参数混淆
4.常用用例
4.1.开启普通用户sudo权限
[user1@node1 ~]$ sudo -l
[sudo] password for user1:
Sorry, user user1 may not run sudo on node1. # 无权限,不能执行sudo命令
[user1@node1 ~]$ exit
logout
[root@node1 ~]# usermod -aG wheel user1 # 通过添加wheel用户组来开启用户的sudo权限
[root@node1 ~]# su - user1
Last login: Mon Jun 9 19:52:58 CST 2025 on pts/4
[user1@node1 ~]$
[user1@node1 ~]$ sudo -l # 开启sudo后可查看到如下信息
[sudo] password for user1:
Matching Defaults entries for user1 on node1:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME
HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User user1 may run the following commands on node1:
(ALL) ALL
[user1@node1 ~]$
4.2.辅助程序进行密码提示
[user1@node1 ~]$ cat passwd.sh
#!/bin/sh
echo "jingjing" # 这里编写用户的密码,仅用于测试环境;这里是最简单的明文密码方式;还可以设置自定义输入或者加密密码文件
[user1@node1 ~]$ chmod 700 passwd.sh
[user1@node1 ~]$ export SUDO_ASKPASS="passwd.sh"
[user1@node1 ~]$ sudo -A -k whoami # -A是启动辅助程序进行密码提示;-k是清空缓存;如果没有-k,shell脚本密码改为错误信息,该命令还是会成功,是因为有缓存
root
[user1@node1 ~]$
4.3.后台执行程序
[user1@node1 ~]$ sudo whoami # 正常执行
root
[user1@node1 ~]$ sudo -b whoami # 后台执行,注意输出的区别
[user1@node1 ~]$ root
# 会卡在此处,回车会到下一行
[user1@node1 ~]$
4.4.保留环境变量
[user1@node1 ~]$ export TESTPATH1="path_value_1"
[user1@node1 ~]$ export TESTPATH2="path_value_2"
[user1@node1 ~]$ export TESTPATH3="path_value_3" # 定义三个变量
[user1@node1 ~]$ sudo -E printenv TESTPATH1 # -E可以打印上面定义的三个变量
path_value_1
[user1@node1 ~]$ sudo --preserve-env=TESTPATH1,TESTPATH2 printenv TESTPATH2 # 保留其中两个变量,可以打印保留的变量
path_value_2
[user1@node1 ~]$ sudo --preserve-env=TESTPATH1,TESTPATH2 printenv TESTPATH3 # 没有保留的变量就不会有结果输出
[user1@node1 ~]$
4.5.编辑root权限的文件
[user1@node1 ~]$ sudo -e /etc/hosts
sudo: /etc/hosts unchanged
[user1@node1 ~]$ sudoedit /etc/hosts # 与sudo -e /etc/hosts等效
[user1@node1 ~]$ sudo vi /etc/hosts # 也可以使用vi/vim编辑
[user1@node1 ~]$
4.6.指定用户/组执行命令
[root@node1 ~]# id -Gn user1 # 打印组名称列表
userg wheel
[root@node1 ~]#
[user1@node1 ~]$ sudo -g user1 -u user1 whoami # user1的用户组不是user1,而是userg
sudo: unknown group: user1
sudo: unable to initialize policy plugin
[user1@node1 ~]$
[user1@node1 ~]$ sudo -g userg -u user1 whoami
user1
[user1@node1 ~]$ sudo -g user2 -u user2 whoami
user2
[user1@node1 ~]$
4.7.用户切换
[user1@node1 ~]$ sudo -i # -i用户切换,不指定-u默认是root用户
[root@node1 ~]# pwd
/root # -i会切换到指定的家目录
[root@node1 ~]# exit
logout
[user1@node1 ~]$ sudo -s # -s用户切换,与-i的区别是所处的目录不同
[root@node1 user1]# pwd
/home/user1 # -s只切换用户,不切换所处的目录
[root@node1 user1]# exit
exit
[user1@node1 ~]$
[user1@node1 ~]$ sudo -i -u user2 # 还可以与-u参数一起使用切换到其他用户
[user2@node1 ~]$ pwd
/home/user2
[user2@node1 ~]$ exit
logout
[user1@node1 ~]$ sudo -s -u user2
[user2@node1 user1]$ pwd
/home/user1
[user2@node1 user1]$
4.8.密码缓存失效方式及延长时间
[user1@node1 ~]$ sudo -K # -K 彻底删除时间戳文件,下一次执行sudo需要输入密码
[user1@node1 ~]$ sudo whoami
[sudo] password for user1:
root
[user1@node1 ~]$ sudo -k whoami # -k 每次都需要输入密码
[sudo] password for user1:
root
[user1@node1 ~]$
[user1@node1 ~]$ sudo whoami
[sudo] password for user1:
root
[user1@node1 ~]$ sudo -v # -v 延长密码有限的时间
[user1@node1 ~]$ sudo whoami
root
[user1@node1 ~]$
4.9.非交互模式
[user1@node1 ~]$ sudo -n whoami # 当缓存密码失效情况下,无交互会报错
sudo: a password is required
[user1@node1 ~]$ sudo whoami # 输入一次缓存密码
[sudo] password for user1:
root
[user1@node1 ~]$ sudo -n whoami # 有缓存情况下,可直接执行
root
[user1@node1 ~]$
4.10.打印用户组信息
[user1@node1 ~]$ groups # 打印当前用户组信息
userg wheel
[user1@node1 ~]$ sudo groups # 打印root用户组信息
[sudo] password for user1:
root
[user1@node1 ~]$ sudo -P groups # 打印root用户组及其当前用户组信息
root wheel userg
[user1@node1 ~]$
4.11.自定义密码提示信息
[user1@node1 ~]$ sudo -K
[user1@node1 ~]$ sudo whoami
[sudo] password for user1: # 默认输入密码的提示信息
root
[user1@node1 ~]$
[user1@node1 ~]$ sudo -K
[user1@node1 ~]$ sudo -p '%h@%u%%password for is:' whoami
node1@user1%password for is: # 自定义输入密码的提示信息,%h主机名,%u用户名,%%百分号
root
[user1@node1 ~]$
4.12.从标准输出读取密码
[user1@node1 ~]$ cat passwd.txt # 文件内指定密码
jingjing
[user1@node1 ~]$ chmod 600 passwd.txt # 密码文件需要600权限
[user1@node1 ~]$ sudo -K # 清除密码缓存文件
[user1@node1 ~]$ sudo -S < passwd.txt whoami # -S读取文件中的密码执行命令
[sudo] password for user1: root # 密码输入提示与输出结果输出到同一行
[user1@node1 ~]$ sudo -S < passwd.txt whoami
root
[user1@node1 ~]$
4.13.sudo执行超时设置(未测试出效果)
[user1@node1 ~]$ sudo -T 10 sleep 30 # 默认不允许
sudo: sorry, you are not allowed set a command timeout
[user1@node1 ~]$