sudo的⽤法
sudo的存在意义
在linux系统下,普通⽤户⽆法直接执⾏root⽤户权限下的命令,如果想让普通⽤户执⾏只有root⽤户才能执⾏的操作命令,就需要⽤到sudo。
下⾯罗列下经常使⽤sudo命令的⼏个场景:
# 授权普通⽤户执⾏root指令
普通⽤户登录 shell 之后,如果⾃⾝没有权限访问某个⽂件或执⾏某个命令时,若该⽤户获得root授权,那么就可以在需要执⾏的命令之前加上 sudo,临时切换到root⽤户的权限,完成相关的操作。在sudo于1980年前后被写出之前,⼀般⽤户管理系统的⽅式是利⽤su切换为超级⽤户。但是使⽤su的缺点之⼀在于必须要先告知超级⽤户的密码,⽽sudo使⼀般⽤户不需要知道超级⽤户的密码即可获得权限。
那么哪些⽤户可以临时获得root权限呢?这就需要在/etc/sudoers⽂件中进⾏配置(或者直接使⽤visudo命令,不过只能在root⽤户下执⾏):
[root@test-huanqiu ~]# visudo
.....
# User privilege specification
zhangj ALL=(ALL) ALL
参数解释:
1)第⼀个字段zhangj指定的是⽤户:可以是⽤户名,也可以是别名。每个⽤户设置⼀⾏,多个⽤户设置多⾏,也可以将多个⽤户设置成⼀个别名后再进⾏设置。
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的不需要输⼊密码。
如果我们想让⽤户wangshibo只能在本主机(主机名为test-huanqiu)以root账户执⾏/bin/chown、/bin/chmod 两条命令,那么就应该这样配置:
[root@test-huanqiu ~]# visudo
.......
# User privilege specification
zhangj test-huanqiu=(root) /bin/chown,/bin/chmod                                    #注意这⾥指令要⽤绝对路劲
如果zhangj⽤户登录之后运⾏sudo命令,不满⾜上⾯三个条件之⼀的操作都将失败。
此时,你在⾮root⽤户的登录时,就能够通过
sudo -u root chmod 755 ***
此时回车,会让你输⼊你登录⽤户的密码,⽽不是root的密码,这样就安全多了。
免密操作:
安全是安全了,但很⿇烦,每次执⾏指令都要输⼊密码,若要消除密码输⼊操作,修改配置⽂件:
使⽤root⽤户
visudo
zhangj      ALL=(root)      NOPASSWD:/usr/bin/vim            #这⾥的NOPASSWD就是配置⽀持免密执⾏的字段
这⾥设置的是vim指令能够⽆密码执⾏!
# 授权给⽤户组:
[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 组。
普通⽤户编辑⽂件没法保存的情况:
有时经常会遇到这样的⼀个囧境:
使⽤vim对某个⽂件进⾏编辑,编辑完之后,按 ESC 之后回到普通模式,再按:wq准备保存退出时,发现没有权限对该⽂件进⾏修改,因为在使⽤vim 命令时忘记在前⾯加sudo了。出现这种问题,⼤多数⼈的做法是只能不保存强退,再加上 sudo 重新编辑保存,
其实⼤可不必这么愚蠢的做法了,巧妙的做法是:
在vim的普通模式下,按:w !sudo tee % ,这样就可以 root 权限来保存⽂件了,你也⽆需因为⾃⼰⼀时忘记加个 sudo ⽽沮丧懊恼了!
亲测可⾏;
但是在下图中:
这⾥选择L,表⽰加载⽂件,再⽤q!退出就保存了。
# 执⾏root命令忘记加sudo:
还会遇到这样稍微好⼀点的情形:输⼊⼀个长长的命令,按Enter之后出现⽆权限操作,因为在命令前⾯忘记加sudo了。
⼤多⼈的做法是按↑回到上⼀条命令,在该命令之前加上sudo,再执⾏该命令。
其实,也⼤可不必这样,巧妙的做法是:
只要输⼊sudo !! 即可,这⾥的 !! 代表上⼀条命令。如:
[zhangjian@test-huanqiu ~]$ cat test
cat: test: Permission denied
[zhangjian@test-huanqiu ~]$ sudo !!
sudo cat test
lala
xiixixi'
nihao
ok,拿到了test⽂件的内容!
# shell内置命令,没法使⽤sudo
shell是⼀个交互式的应⽤程序,在执⾏外部命令时通过fork来创建⼀个⼦进程,再通过exec来加载外部命令的程序来执⾏。
但是如果⼀个命令是shell内置命令,那么只能直接由shell 来运⾏。
sudo 的意思是,以别的⽤户(如root)的权限来fork⼀个进程,加载程序并运⾏,因此sudo后⾯不能跟shell 的内置命令。
实例说明:
[zhangj@test-huanqiu ~]$ sudo 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了。
[zhangj@test-huanqiu ~]$ sudo bash                  //或者sudo su - 或者 sudo -s,其实就使⽤sudo命令从当前⽤户切换到root⽤户
[root@test-huanqiu debug]# cd /sys/kernel/debug/
[root@test-huanqiu debug]#
# sudo操作记⼊⽇志
作为⼀个Linux系统的管理员,不仅可以让指定的⽤户或⽤户组作为root⽤户或其它⽤户来运⾏某些命令,
还能将指定的⽤户所输⼊的命令和参数作详细的记录。⽽sudo的⽇志功能就可以⽤户跟踪⽤户输⼊的命令,这不仅能增进系统的安全性,还能⽤来进⾏故障检修。
1)创建sudo⽇志⽂件
我们将sudo⽇志⽂件放置在/var/log/sudo.log ⽂件中:
[zhangj@ops-server4 ~]$ sudo touch /var/log/sudo.log
2)修改/f配置⽂件(有些版本系统的这个⽂件名为/f),在该⽂件加⼊下⾯⼀⾏:
[zhangj@ops-server4 ~]$ sudo vim /f
.........
local2.debug /var/log/sudo.log //空⽩不能⽤空格,必须⽤tab
3)修改/etc/sudoers 配置⽂件
注意⽹上很多关于sudo⽇志⽂件配置都缺少这⼀步!在该⽂件中加⼊下⾯⼀⾏:
[zhangj@ops-server4 ~]$ sudo vim /etc/sudoers
........
Defaults logfile=/var/log/sudo.log
4)重启 syslog 服务:
[zhangj@ops-server4 ~]$ sudo service rsyslog restart
5)最后,就可以查看sudo⽇志记录了:
经过上⾯的配置,sudo的所有成功和不成功的sudo命令都记录到⽂件/var/log/sudo.log 中。
例如我上⾯运⾏⼏条sudo 命令之后,查看该⽂件的记录如下:
[zhangj@ops-server4 ~]$ cat /var/log/sudo.log
Dec 3 11:28:38 : zhangj: TTY=pts/0 ; PWD=/home/zhangj ; USER=root ;
COMMAND=/sbin/service rsyslog restart
Dec 3 11:29:49 : zhangj : TTY=pts/0 ; PWD=/home/zhangj ; USER=root ;
COMMAND=/bin/cat /etc/passwd
Dec 3 11:29:56 : zhangj : TTY=pts/0 ; PWD=/home/zhangj ; USER=root ;
COMMAND=/usr/bin/vim /root/a.sh
Dec 3 11:30:35 : zhangj : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.shsa
Dec 3 11:30:47 : zhangj : user NOT in sudoers ; TTY=pts/0 ;
PWD=/home/guohuihui ; USER=root ; COMMAND=/usr/bin/vim /root/a.sh
vim命令的用法谁做了什么操作,⼀⽬了然!
很强势!
# 为多个⽤户分配不同的组:
在root⽤户的情况下,编辑/etc/group⽂件,这个⽂件就是控制系统的组和⽤户所属组情况的。
groupadd sudo                #因为没有指定gid,所以就按着⽂件中的gid往后推的
sudo:x:504:                    #添加完之后在该⽂件中就出现了这条字段。
修改为:
sudo:x:504:batman,test            #此时,⽤户batman和test的附属组就是sudo了
此时再visudo
%sudo  ALL=(root)      NOPASSWD:/usr/bin/vim
%sudo  ALL=(root)      NOPASSWD:/bin/cat
保存退出,可以⽤:
visudo -c    来检查语法
返回OK,没问题
检测:
-rw-------. 1 root root 1595 Jul 24 05:f
-rw-------. 1 root root    8 Jul 24 05:00 rsyncd.pass
-rw-------. 1 root root  14 Jul 24 05:00 rsyncd.pwd
这三个⽂件,只有root有操作权限,现在
[test@zj rsync]$ sudo f
发现也是ok的。
说明配置成功!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。