在linux系统下,普通用户没法直接执行root用户权限下的命令,若是想让普通用户执行只有root用户才能执行的操做命令。
下面罗列下常用sudo命令的几个场景:html
1.用户无权限执行root命令
普通用户登陆 shell 以后,若是自身没有权限访问某个文件或执行某个命令时,若该用户得到root受权,那么就能够在须要执行的命令以前加上 sudo,临时切换到root用户的权限,完成相关的操做。在sudo于1980年先后被写出以前,通常用户管理系统的方式是利用su切换为超级用户。可是使用su的缺点之一在于必需要先告知超级用户的密码,而sudo使通常用户不须要知道超级用户的密码便可得到权限。linux
那么哪些用户能够临时得到root权限呢?这就须要在/etc/sudoers文件中进行配置(或者直接使用visudo命令,不过只能在root用户下执行):
(1)受权给单个用户:
[root@test-huanqiu ~]# visudo
.....
# User privilege specification
wangshibo ALL=(ALL) ALL
参数解释:
1)第一个字段wangshibo指定的是用户:能够是用户名,也能够是别名。每一个用户设置一行,多个用户设置多行,也能够将多个用户设置成一个别名后再进行设置。
2)第二个字段ALL指定的是用户所在的主机:能够是ip,也能够是主机名,表示这个sudo设置后的文件即/etc/sudoers只在这个主机上生效,ALL表示在全部主机上都生效!限制的通常都是本机,也就是限制使用这个文件的主机;若是指定为"192.168.1.88="表示这个文件只有在这台主机上生效,若是拷贝到别的机子上是不起做用的!通常都指定为"ALL"表示全部的主机,无论文件拷到那里均可以用。
3)第三个字段(ALL)括号里指定的也是用户:指定以什么用户身份执行sudo,即便用sudo后能够享有全部帐号下的权限。若是要排除个别用户,能够在括号内设置,好比ALL=(ALL,!root,!ops)。也能够设置别名
4)第四个字段ALL指定的是执行的命令:即便用sudo后能够执行全部的命令。也能够设置别名。NOPASSWD: ALL表示使用sudo的不须要输入密码。shell
若是咱们想让用户wangshibo只能在本主机(主机名为test-huanqiu)以root帐户执行/bin/chown、/bin/chmod 两条命令,那么就应该这样配置:
[root@test-huanqiu ~]# visudo
.......
# User privilege specification
wangshibo test-huanqiu=(root) /bin/chown,/bin/chmod
若是wangshibo用户登陆以后运行sudo命令,不知足上面三个条件命令均失败。vim
(2)受权给用户组:
[root@test-huanqiu ~]# visudo
.....
# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move it further down)
%sudo ALL=(ALL) ALL
和受权给单个用户相似,只不过将用户名在这里换成%组名,全部在该组中的用户都按照此规则进行受权。对于该例,全部在 sudo 组内的用户都有在任何终端(第一个ALL)、以任何用户(第二个ALL)、执行任何命令(第三个ALL)的权限,查看 /etc/group 文件能够知道哪些用户属于 sudo 组。安全
实例说明:
若是当前账号在/etc/sudoers文件中被授予sudo的权限,那么你就能够将任何root命令做为sudo 命令的参数,使用root权限来执行该命令。bash
好比挂载一个文件系统只能由root来执行,可是一个普通用户也可使用sudo来挂载:
[wangshibo@test-huanqiu ~]$ sudo mount /dev/sda7 /mnt
[sudo] password for wangshibo:
首次使用会要求你输入当前用户的密码,系统确实输入正确即以 root 权限来执行 mount 命令,接下来一段时间(默认为5分钟)再次使用 sudo 命令就不须要输密码了。ide
2.vim编辑后发现忘记使用sudo
有时常常会遇到这样的一个囧境:
使用vim对某个文件进行编辑,编辑完以后,按 ESC 以后回到普通模式,再按:wq准备保存退出时,发现没有权限对该文件进行修改,由于在使用vim 命令时忘记在前面加sudo了。出现这种问题,大多数人的作法是只能不保存强退,再加上 sudo 从新编辑。ui
其实大可没必要这么愚蠢的作法了,巧妙的作法是:
在vim的普通模式下,按 :w !sudo tee % ,这样就能够 root 权限来保存文件了,你也无需由于本身一时忘记加个 sudo 而沮丧懊恼了!this
实例说明:
使用guohuihui用户在/tmp目录下建立了一个文件,默认状况下,wangshibo用户对这个文件是没有操做权限的
[root@ops-server4 ~]# su - guohuihui
[guohuihui@ops-server4 ~]$ vim /tmp/guohuihui
[guohuihui@ops-server4 ~]$ cat /tmp/guohuihui
sdfasdfsdspa
如今给wangshibo用户设置了sudo权限,编辑上面文件时,忘了在命令前面加sudo命令了
[wangshibo@ops-server4 ~]$ vim /tmp/guohuihui
编辑完,直接输入w保存时,会报错说没有权限:
"/tmp/guohuihui"
"/tmp/guohuihui" E212: Can't open file for writing
Press ENTER or type command to continue
这个时候能够按:w !sudo tee %就能够正常保存了。轻松搞定!!效果以下:
:w !sudo tee % //回车
sdfasdfsd
12345666
W12: Warning: File "/tmp/guohuihui" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
这个时候回车,而后再输入q退出,查看发现刚才输入的内容已经保存下来了:
[wangshibo@ops-server4 ~]$ cat /tmp/guohuihui
sdfasdfsd
12345666
3.执行root 命令忘记加sudo
还会遇到这样稍微好一点的情形:输入一个长长的命令,按Enter以后出现无权限操做,由于在命令前面忘记加sudo了。
大多人的作法是按 ↑ 回到上一条命令,在该命令以前加上sudo,再执行该命令。
其实,也大可没必要这样,巧妙的作法是:
只要输入 sudo !! 便可,这里的 !! 表明上一条命令。如:
实例说明:
[wangshibo@ops-server4 ~]$ cat /etc/sudoers|tail -3
cat: /etc/sudoers: Permission denied
[wangshibo@ops-server4 ~]$ sudo !!
sudo cat /etc/sudoers|tail -3
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
----------------------------------------------------------
在linux终端下:
输入!! 表示上一个命令
输入Esc+.(符号点) 表示上一个命令中的最后一部分
cd - 表示切换到上一个路径下
cd和cd ~ 表示切换到当前用户家目录下
----------------------------------------------------------
4.shell内置命令使用sudo
shell是一个交互式的应用程序,在执行外部命令时经过fork来建立一个子进程,再经过exec来加载外部命令的程序来执行。
可是若是一个命令是shell内置命令,那么只能直接由shell 来运行。
sudo 的意思是,以别的用户(如root)的权限来fork一个进程,加载程序并运行,所以sud 后面不能跟shell 的内置命令。
实例说明:
[wangshibo@ops-server4 ~]$ sudo cd cd /sys/kernel/debug/
sudo: cd: command not found
在这种状况,咱们又没有root帐户的密码,咱们怎样执行该命令呢?
有种办法就是使用sudo得到root shell 的权限,而后在root shell中执行该命令。
进入root shell 很简单,输入sudo bash确认本用户的密码便可(若是/etc/sudoers里配置了无密码使用sudo,就不须要驶入密码),此时你会发现命令提示符显示当前 root。一旦得到root shell,你就能够执行任何命令而不须要在每条命令前输入sudo了。
[wangshibo@ops-server4 ~]$ sudo bash //或者sudo su - 或者 sudo -s,其实就使用sudo命令切换到root下
[root@ops-server4 wangshibo]# cd /sys/kernel/debug/
[root@ops-server4 debug]#
咱们可使用 type 命令来查看命令的类型,如:
[wangshibo@ops-server4 ~]$ type cd
cd is a shell builtin
[wangshibo@ops-server4 ~]$ type umask
umask is a shell builtin
5.sudo 操做记录日志
做为一个Linux系统的管理员,不只可让指定的用户或用户组做为root用户或其它用户来运行某些命令,还能将指定的用户所输入的命令和参数做详细的记录。
而sudo的日志功能就能够用户跟踪用户输入的命令,这不只能增进系统的安全性,还能用来进行故障检修。
可是要记录sudo的日志还要一些简单的配置:
1)建立sudo日志文件
咱们将sudo日志文件放置在/var/log/sudo.log 文件中:
[wangshibo@ops-server4 ~]$ sudo touch /var/log/sudo.log
2)修改/etc/rsyslog.conf配置文件(有些版本系统的这个文件名为/etc/syslog.conf),在该文件加入下面一行:
[wangshibo@ops-server4 ~]$ sudo vim /etc/rsyslog.conf
.........
local2.debug /var/log/sudo.log //空白不能用空格,必须用tab
3)修改/etc/sudoers 配置文件
注意网上不少关于sudo日志文件配置都缺乏这一步!在该文件中加入下面一行:
[wangshibo@ops-server4 ~]$ sudo vim /etc/sudoers
........
Defaults logfile=/var/log/sudo.log
4)重启 syslog 服务:
[wangshibo@ops-server4 ~]$ sudo service rsyslog restart
5)最后,就能够查看sudo日志记录了:
通过上面的配置,sudo的全部成功和不成功的sudo命令都记录到文件/var/log/sudo.log 中。
例如我上面运行几条sudo 命令以后,查看该文件的记录以下:
[wangshibo@ops-server4 ~]$ cat /var/log/sudo.log
Dec 3 11:28:38 : wangshibo : TTY=pts/0 ; PWD=/home/wangshibo ; USER=root ;
COMMAND=/sbin/service rsyslog restart
Dec 3 11:29:49 : wangshibo : TTY=pts/0 ; PWD=/home/wangshibo ; USER=root ;
COMMAND=/bin/cat /etc/passwd
Dec 3 11:29:56 : wangshibo : TTY=pts/0 ; PWD=/home/wangshibo ; USER=root ;
COMMAND=/usr/bin/vim /root/a.sh
Dec 3 11:30:35 : guohuihui : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.shsa
Dec 3 11:30:47 : guohuihui : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.sh
linux下的其余权限能够参考:linux系统下的权限知识梳理