Linux(Centos 7.6)命令详解:sudo

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 ~]$ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆是浪个

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值