sudo命令详解

sudo命令是Linux上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他特许用户才能完成的任务,比如:运行一些像mount,userdel,useradd之类的命令,或者编辑一些系统配置文件,像/etc/passwd,/etc/samba/smb.conf等。这样以来,就不仅减少了root用户的登陆次数和管理时间,也提高了系统安全性。


一、sudo命令的特点

 1. sudo能够限制指定用户在指定主机上运行某些命令。

 2. sudo可以提供日志,忠实地记录每个用户使用sudo做了些什么,并且能将日志传到中心主机或者日志服务器。

 3. sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机。它默认的存放位置是/etc/sudoers。

 4.sudo使用时间戳文件来完成类似“检票”的系统。当用户执行sudo并且输入密码后,用户获得了一张默认存活期为300秒的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码。


二、配置文件

 1)授权机制:sudo的授权配置文件,/etc/sudoers


  对于此配置文件,共分为两类内容:

1.别名的定义:定义内建变量;

2.用户规格:其实就是授权项,其中可以调用定义过的别名;


  2)用户规格(授权项):

每行只能有一个授权项;

其格式为:

who  where=(whom)  what

user client=(runas) commands

注意:通过编辑/etc/sudoers文件完成的授权,只能通过sudo命令来启用;


3)/etc/sudoers文件的编写格式:

who: 此次sudo配置的授权目标用户;

username:单个用户的用户账户名称;

#uid:单个用户的UID;

%groupname:指定组内的所有用户账户;

%#gid:以"gid"为GID的组内的所有用户账户;

user_alias:事先定义过的用户账户的别名;


where:定义被授权访问的客户端主机;

ip/hostname:单个主机;

Network Address:网络地址;

host_alias:事先定义过的主机的别名;


whom:授权用户后续命令的运行者的真实身份;通常是root;


what:此次授权能够运行的命令;

command:单个命令;

directory:指定目录下所有的命令;

sudoedit:特殊命令,用于授权其他用户可以执行sudo命令,并且可以编辑/etc/sudoers文件;

cmnd_alias:实现定义过的命令的别名;


三、命令参数

 sudo [option]... command

 -u user:以指定的用户身份运行命令;

 -h  会显示版本编号及指令的使用方式说明

 -l  显示出自己(执行sudo的使用者)的权限

 -v  因为sudo在第一次执行时或是在 N 分钟内没有执行(N 预设为5)会问密码,这个参数是重新做一次确认,如果超过N分钟,也会问密码

 -k  将会强迫使用者在下一次执行sudo时问密码(不论有没有超过N分钟)  

 -b  将要执行的指令放在背景执行

 -p  prompt 可以更改问密码的提示语,其中%u会代换为使用者的帐号名称,%h会显示主机名称


四、定义别名的方法

 Alias_Type ALIASNAME = item1, item2, ...


 Alias_Type:

User_Alias:

Host_Alias:

Runas_Alias:

Cmnd_Alias:


 ALIASNAME:别名的名称必须全部使用大写字母;


 User_Alias USERADMINUSERS = tom, jerry, centos, suse, %myclass


 Cmnd_Alias USERADMINCOMMANDS = /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd [a-zA-Z0-9]*, ! /usr/bin/passwd root, /usr/sbin/usermod


 USERADMINUSERS ALL=(root) USERADMINCOMMANDS


 常用的标签:

PASSWD

NOPASSWD


 Cmnd_Alias USERADMINCOMMANDS = NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/userdel, /usr/bin/passwd [a-zA-Z0-9]*, ! /usr/bin/passwd root, /usr/sbin/usermod


 这样NOPASSWD后面的命令在执行的时候是不需要输入密码的,PASSWD后面的命令执行的时候则需要输入密码。