sudo的用法

  • 格式:pdf
  • 大小:142.41 KB
  • 文档页数:2

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。⼀旦获得rootshell,你就可以执⾏任何命令⽽不需要在每条命令前输⼊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)修改/etc/rsyslog.conf配置⽂件(有些版本系统的这个⽂件名为/etc/syslog.conf),在该⽂件加⼊下⾯⼀⾏:

[zhangj@ops-server4 ~]$ sudo vim /etc/rsyslog.conf

.........

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

谁做了什么操作,⼀⽬了然!

很强势!

# 为多个⽤户分配不同的组:

在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