说明

  通过sudo命令,可以让普通用户在执行指定命令或程序上,拥有超级管理员的权限。并有针对性将不同的命令授予指定的普通用户,同时普通用户不需要知道root的密码就可以得到授权,授权的方式可以通过visudo配置管理。

格式

  sudo [option]

常用参数
  • -V 显示版本编号
  • -h 会显示版本编号及指令的使用方式说明
  • -l 显示出自己(执行 sudo 的使用者)的权限
  • -v 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码
  • -k 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟)
  • -b 将要执行的指令放在背景执行
  • -p prompt 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称
  • -u username/#uid 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码)
  • -s 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
  • -H 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root )
  • command 要以系统管理者身份(或以 -u 更改为其他人)执行的指令
示例
1、没有通过visudo配置然后查看root家目录
[skip@localhost ~]$ ls /root/ #没有权限
ls: cannot open directory /root/: Permission denied
[skip@localhost ~]$ sudo ls /root/ #加了sudo命令,提示输入密码,但是最后也不行

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for skip:  #这里输入密码
skip is not in the sudoers file.  This incident will be reported. #提示该用户没有在sudoers文件里


2、通过visudo配置,在root对应的行下添加如下信息:保存
[root@localhost ~]# visudo
98 root    ALL=(ALL)   ALL
99 skip    ALL=(ALL)   ALL #添加改行信息,99不要是行号

[skip@localhost ~]$ ls /root/ #提示没权限
ls: cannot open directory /root/: Permission denied
[skip@localhost ~]$ sudo ls -l /root/ #使用sudo命令
[sudo] password for skip:  #输入密码,列表正常显示
total 1180992
-rw-------.  1 root  root        815 May  5 13:20 anaconda-ks.cfg
-rw-r--r--.  1 root  root  119914627 Mar 29 10:47 go1.10.1.linux-amd64.tar.gz
drwxr-xr-x.  7 root  root       4096 May  6 03:26 memcached-3.0.4
-rw-r--r--.  1 root  root      78776 Nov 21 00:02 memcached-3.0.4.tgz
-rw-r--r--.  1 root  root   99406523 Apr 13 14:27 mongodb-linux-x86_64-rhel70-3.6.4.tgz
-rw-r--r--.  1 root  root  328563044 May  5 06:14 mysql-5.6.40-linux-glibc2.12-x86_64.tar.gz
-rw-r--r--.  1 root  root  641798603 Apr 17 07:07 mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz
drwxr-xr-x.  9 mysql mysql      4096 May  5 13:48 nginx-1.12.2
-rw-r--r--.  1 root  root     981687 Oct 17  2017 nginx-1.12.2.tar.gz
-rw-r--r--.  1 nginx wheel     22710 Apr 25 07:28 package.xml
-rw-r--r--.  1 root  root        160 May 13 05:41 pass.txt
drwxrwxr-x. 17 root  root       4096 May  5 17:20 php-7.2.5
-rw-r--r--.  1 root  root   18305092 May  5 09:01 php-7.2.5.tar.gz
drwxr-xr-x.  9 root  root       4096 May  6 03:30 redis-4.0.2
-rw-r--r--.  1 root  root     212617 Apr 25 07:37 redis-4.0.2.tgz
drwxr-xr-x.  3 root  root       4096 May  7 22:45 test
总结

1、sudo命令提示输入密码,输入的当前用户的密码,不是root的密码;
2、输入密码成功后,当前用户会获得一张默认存活期为5分钟的“令牌”,使用/var/db/sudo可以查看该文件。如果超过该时间,用户就必须重新输入密码。
3、可以使用-k参数来清除sudo用户的时间戳,这样下次执行sudo命令将重新输入密码。但是如果在配置授权对应用户加了NOPASSWD选项,那么该用户使用sudo命令将永远不会提示输入密码。如:skip ALL=(ALL) NOPASSWD: ALL
4、sudo的配置文件/etc/sudoers,建议采用visudo编辑该文件。