sudo命令用来以其他身份来执行命令,预设的身份为root。
1.命令格式:
sudo [参数] [命令]
2.命令功能:
功能: sudo可以针对单个命令授予临时权限。用户也可以通过su切换到root用户运行命令,su启动一个root shell允许用户运行之后的所有的命令。
1)sudo与su的不同之处:sudo仅在需要时授予用户权限,减少了用户因为错误执行命令损坏系统的可能性;sudo也可以用来以其他用户身份执行命令。此外,sudo可以记录用户执行的命令,以及失败的特权获取。
2)提醒:在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。
3)[root@localhost etc]# cat sudoers 查看/etc下的只有root才能打开的文件配置文件sudoers
[xiong@localhost ~]$ yum update mysql//yum的执行需要root权限已加载插件:fastestmirror, langpacks您需要 root 权限执行此命令。[xiong@localhost ~]$ sudo yum update mysql //默认情况下sudo获得root用户的权限We trust you have received the usual lecture from the local SystemAdministrator. 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 xiong: xiong 不在 sudoers 文件中。此事将被报告。//此时sunmeng还没有使用sudo的权限
View Code
4)给普通用使用sudo命令的授权:
## Sudoers allows particular users to run various commands as## the root user, without needing the root password.## 该文件允许特定用户像root用户一样使用各种各样的命令,而不需要root用户的密码#### Examples are provided at the bottom of the file for collections## of related commands, which can then be delegated out to particular## users or groups.## 在文件的底部提供了很多相关命令的示例以供选择,这些示例都可以被特定用户或## 用户组所使用 #### This file must be edited with the 'visudo' command.## 该文件必须使用"visudo"命令编辑## Host Aliases## Groups of machines. You may prefer to use hostnames (perhaps using ## wildcards for entire domains) or IP addresses instead.## 对于一组服务器,你可能会更喜欢使用主机名(可能是全域名的通配符)## 、或IP地址,这时可以配置主机别名# Host_AliasFILESERVERS = fs1, fs2# Host_AliasMAILSERVERS = smtp, smtp2## User Aliases## These aren't often necessary, as you can use regular groups## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname ## rather than USERALIAS## 这并不很常用,因为你可以通过使用组来代替一组用户的别名# User_Alias ADMINS = jsmith, mikem## Command Aliases## These are groups of related commands...## 指定一系列相互关联的命令(当然可以是一个)的别名,通过赋予该别名sudo权限,## 可以通过sudo调用所有别名包含的命令,下面是一些示例## Networking 网络操作相关命令别名# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool## Installation and management of software 软件安装管理相关命令别名# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum## Services 服务相关命令别名# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig## Updating the locate database 本地数据库升级命令别名# Cmnd_Alias LOCATE = /usr/bin/updatedb## Storage 磁盘操作相关命令别名# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount## Delegating permissions 代理权限相关命令别名# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp ## Processes 进程相关命令别名# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall## Drivers 驱动命令别名# Cmnd_Alias DRIVERS = /sbin/modprobe# Defaults specification## Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>".# 一些环境变量的相关配置,具体情况可见man soduersDefaults requiretty//设为默认的目标用户,69行是系统自带的,是对所有用户的默认,如果设sunmeng为默认目标用户,则语法为:Defaults:foobar runas_default=rene (冒号必不可少)Defaults env_resetDefaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple## systems).## 下面是规则配置:什么用户在哪台服务器上可以执行哪些命令(sudoers文件可以在多个系统上共享)## Syntax(语法):####user MACHINE=COMMANDS 用户 登录的主机=(可以变换的身份) 可以执行的命令#### The COMMANDS section may have other options added to it.## 命令部分可以附带一些其它的选项#### Allow root to run any commands anywhere ## 允许root用户执行任意路径下的任意命令root ALL=(ALL)ALL//第一个ALL是指网络中的主机,我们后面把它改成了主机名。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。## Allows members of the 'sys' group to run networking, software, ## service management apps and more.## 允许sys中户组中的用户使用NETWORKING等所有别名中配置的命令# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS## Allows people in group wheel to run all commands## 允许wheel用户组中的用户执行所有命令%wheel ALL=(ALL) ALL## Same thing without a password## 允许wheel用户组中的用户在不输入该用户的密码的情况下使用所有命令# %wheel ALL=(ALL) NOPASSWD: ALL## Allows members of the users group to mount and unmount the ## cdrom as root## 允许users用户组中的用户像root用户一样使用mount、unmount、chrom命令# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom## Allows members of the users group to shutdown this system## 允许users用户组中的用户关闭localhost这台服务器# %users localhost=/sbin/shutdown -h now## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)## 读取放置在/etc/sudoers.d/文件夹中的文件(此处的#不意味着这是一个声明)#includedir /etc/sudoers.d
View Code
5)简单的测试:
visudo后得到的格式为:账户名 主机名称=(可切换的身份) 可用的指令//比如root账户root ALL=(ALL) ALL对于新增的账户就在下面加上test ALL=(root) ALL//允许test用sudo命令执行root的所有命令 同理对于组使用者也是一个,但是要加上%%testgroup ALL=(root) ALL需要注意的是:每次切换,你都需要密码才可以,使用如下命令可以避免输入密码:test ALL=(root) NOPASSWD: ALL-------------------------------[root@localhost xiong]# visudo//这里的visudo不需要任何参数,因为它是打开sudoers的专属命令//改过的地方##user MACHINE=COMMANDS#### The COMMANDS section may have other options added to it.#### Allow root to run any commands anywhereroot ALL=(ALL) ALLxiong ALL=(ALL)ALL
View Code
[xiong@localhost ~]$ ls//当前身份执行命令Desktop Documents Downloads Music Pictures Public Templates Videos [xiong@localhost ~]$ sudo ls //利用root身份执行命令Desktop Documents Downloads Music Pictures Public Templates Videos[xiong@localhost ~]$ yum update mysql //当前身份执行命令,提醒需要root身份已加载插件:fastestmirror, langpacks您需要 root 权限执行此命令。[xiong@localhost ~]$ sudo yum update mysql//以root身份执行命令(在终端中第一次用这个命令时会提醒输入密码)已加载插件:fastestmirror, langpacksbase | 3.6 kB00:00extras | 3.4 kB00:00updates| 3.4 kB00:00Loading mirror speeds from cached hostfile* base: mirrors.* extras: mirrors.* updates: mirrors.No packages marked for update
View Code
3.命令参数:
1)-b 在后台运行命令
2)-u user 以指定用户身份运行命令(或编辑文件)
3) -l 查看当前用户可以执行的命令
4) -v更新用户的时间戳而不执行命令(注意:在输入密码之后,5分钟内执行sudo不需要再次输入密码。)
5) -V 显示sudo的版本信息
6) -i 以目标用户登录一个shell
4.使用实例:
示例1:指定用户名
命令:sudo -u root yum install mysql-devel
[xiong@localhost Desktop]$ sudo -u root yum install mysql-devel-u参数比较有用的地方是在多用户时,可以临时获得权限打开用户独占的文件已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfile* base: mirrors.* extras: mirrors.* updates: mirrors.正在解决依赖关系--> 正在检查事务......--> 解决依赖关系完成依赖关系解决=============================================================================================================Package 架构 版本源 大小=============================================================================================================正在安装:mariadb-devel x86_64 1:5.5.47-1.el7_2 ......作为依赖被升级:krb5-libs.x86_64 0:1.13.2-12.el7_2krb5-workstation.x86_64 0:1.13.2-12.el7_2openssl.x86_64 1:1.0.1e-51.el7_2.5openssl-libs.x86_64 1:1.0.1e-51.el7_2.5 pcre.x86_64 0:8.32-15.el7_2.1 zlib.x86_64 0:1.2.7-15.el7完毕!
示例2:sudo命令与rpm命令结合使用的几个例子
[xiong@localhost Desktop]$ sudo rpm -q MySQL-embedded-5.5.28-1.linux2.6.i386.rpm[sudo] password for xiong: 未安装软件包 MySQL-embedded-5.5.28-1.linux2.6.i386.rpm [xiong@localhost Desktop]$ sudo rpm -qpR MySQL-embedded-5.5.28-1.linux2.6.i386.rpmMySQL-devellibaio.so.1libaio.so.1(LIBAIO_0.1)libaio.so.1(LIBAIO_0.4)libc.so.6libc.so.6(GLIBC_2.0)libc.so.6(GLIBC_2.1)libc.so.6(GLIBC_2.1.3)libc.so.6(GLIBC_2.2)libc.so.6(GLIBC_2.3)libc.so.6(GLIBC_2.3.3)libcrypt.so.1libcrypt.so.1(GLIBC_2.0)libdl.so.2libdl.so.2(GLIBC_2.0)libdl.so.2(GLIBC_2.1)libm.so.6libm.so.6(GLIBC_2.0)libm.so.6(GLIBC_2.1)libncurses.so.5libpthread.so.0libpthread.so.0(GLIBC_2.0)libpthread.so.0(GLIBC_2.1)libpthread.so.0(GLIBC_2.2)libpthread.so.0(GLIBC_2.3.2)librt.so.1librt.so.1(GLIBC_2.2)rpmlib(CompressedFileNames) <= 3.0.4-1rpmlib(PayloadFilesHavePrefix) <= 4.0-1
示例3:列出用户可以执行的命令
命令:sudo -l
[xiong@localhost Desktop]$ sudo -l匹配此主机上 xiong 的默认条目:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRCKDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE",env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAMELC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin用户 xiong 可以在该主机上运行以下命令:(ALL) ALL
示例4:以目标身份登录一个shell
命令:sudo -i
[root@localhost Desktop]# sudo -i[root@localhost ~]# sudo -i
示例5:显示详细的sudo的版本信息
命令:sudo -V
1 [root@localhost ~]# sudo -V 2 Sudo 版本 1.8.6p7 3 当前选项:--build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --prefix=/usr --sbindir=/usr/sbin --libdir=/usr/lib64 --docdir=/usr/share/doc/sudo-1.8.6p7 --with-logging=syslog --with-logfac=authpriv --with-pam --with-pam-login --with-editor=/bin/vi --with-env-editor --with-ignore-dot --with-tty-tickets --with-ldap --with-ldap-conf-file=/etc/sudo-ldap.conf --with-selinux --with-passprompt=[sudo] password for %p: --with-linux-audit --with-sssd 4 Sudoers 策略插件版本 1.8.6p7 5 Sudoers 文件语法版本 42 6 7 Sudoers 路径:/etc/sudoers 8 nsswitch 路径:/etc/nsswitch.conf 9 ldap.conf 路径:/etc/sudo-ldap.conf 10 ldap.secret 路径:/etc/ldap.secret 11 认证方法: 'pam' 12 若使用了 syslog,用于记录日志的 syslog 设施:authpriv 13 用户认证成功时使用的 syslog 优先级:notice 14 用户认证不成功时使用的 syslog 优先级:alert 15 忽略 $PATH 中的“.” 16 在用户不在 sudoers 列表中时发送邮件 17 对每个用户/终端组合使用独立的时间戳 18 在用户第一次运行 sudo 时向他致辞 19 默认要求用户认证 20 root 可以运行 sudo 21 总是将 $HOME 设为目标用户的主目录 22 允许收集一些信息,以提供有用的错误消息 23 只允许拥有终端的用户执行 sudo 24 Visudo 将优先考虑 EDITOR 环境变量 25 设置 LOGNAME 和 USER 环境变量 26 日志文件折行的长度(0 则不折行):80 27 认证时间戳延时:5.0 分钟 28 密码提示延时:5.0 分钟 29 输入密码的尝试次数:3 30 要使用的 umask,或 0777 使用用户的:022 31 邮件程序路径:/usr/sbin/sendmail 32 邮件程序标志:-t 33 发送邮件的地址:root 34 邮件消息的主题行:*** SECURITY information for %h *** 35 密码错误消息:Sorry, try again. 36 认证时间戳文件夹的路径:/var/db/sudo 37 默认密码提示:[sudo] password for %p: 38 运行命令的默认用户:root 39 覆盖用户的 $PATH 变量的值:/sbin:/bin:/usr/sbin:/usr/bin 40 visudo 所使用的编辑器的路径:/bin/vi 41 何时为“list”伪命令请求密码:any 42 何时为“verify”伪命令请求密码:all 43 >= 3 的文件描述符将会在执行命令前关闭 44 将环境重设为默认的变量集 45 要检查完整性的环境变量: 46TERM 47LINGUAS 48LC_* 49LANGUAGE 50LANG 51COLORTERM 52 要移除的环境变量: 53RUBYOPT 54RUBYLIB 55PYTHONUSERBASE 56PYTHONINSPECT 57PYTHONPATH 58PYTHONHOME 59TMPPREFIX 60ZDOTDIR 61READNULLCMD 62NULLCMD 63FPATH 64PERL5DB 65PERL5OPT 66PERL5LIB 67PERLLIB 68PERLIO_DEBUG 69JAVA_TOOL_OPTIONS 70SHELLOPTS 71GLOBIGNORE 72PS4 73BASH_ENV 74ENV 75TERMCAP 76TERMPATH 77TERMINFO_DIRS 78TERMINFO 79_RLD* 80LD_* 81PATH_LOCALE 82NLSPATH 83HOSTALIASES 84RES_OPTIONS 85LOCALDOMAIN 86CDPATH 87IFS 88 要保留的环境变量: 89XAUTHORITY 90_XKB_CHARSET 91LINGUAS 92LANGUAGE 93LC_ALL 94LC_TIME 95LC_TELEPHONE 96LC_PAPER 97LC_NUMERIC 98LC_NAME 99LC_MONETARY100LC_MESSAGES101LC_MEASUREMENT102LC_IDENTIFICATION103LC_COLLATE104LC_CTYPE105LC_ADDRESS106LANG107USERNAME108QTDIR109PS2110PS1111MAIL112LS_COLORS113KDEDIR114INPUTRC115HISTSIZE116HOSTNAME117DISPLAY118COLORS119 解析 sudoers 时使用的区域设置:C120 使用 zlib 压缩 I/O 日志121 用于保存输入/输出日志的目录:/var/log/sudo-io122 用于保存输入/输出日志的文件:%{seq}123 在分配伪终端时向 utmp/utmpx 文件中添加一条记录124 125 本地 IP 地址和网络掩码对:126192.168.0.15/255.255.255.0127fe80::20c:29ff:fe9f:bf8b/ffff:ffff:ffff:ffff::128 129 Sudoers I/O plugin version 1.8.6p7
View Code