1、su 的用法
通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,而普通用户切换到其它任何用户都需要密码验证。
su [OPTION选项参数] [用户]
语 法:su [-flmp][--help][--version][-][-c <指令>][-s ][用户帐号]
[root@localhost babyfish]# su --h
Usage: su [OPTION]... [-] [USER [ARG]...]
Change the effective user id and group id to that of USER.
-, -l, --login make the shell a login shell,
clears all envvars except for TERM,
initializes HOME, SHELL, USER, LOGNAME and PATH #改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname;此外,也会变更PATH变量
-c, --command=COMMAND pass a single COMMAND to the shell with -c #执行完指定的指令后,即恢复原来的身份
--session-command=COMMAND pass a single COMMAND to the shell with -c
and do not create a new session
-f, --fast pass -f to the shell (for csh or tcsh) #适用于csh与tsch,使shell不用去读取启动文件
-m, --preserve-environment do not reset HOME, SHELL, USER, LOGNAME
environment variables #变更身份时,不要变更环境变量
-p same as -m
-s, --shell=SHELL run SHELL if /etc/shells allows it #指定要执行的shell
--help display this help and exit #显示帮助
--version output version information and exit #显示版本信息
A mere - implies -l. If USER not given, assume root.
Report su bugs to [email protected]
GNU coreutils home page:
General help using GNU software:
For complete documentation, run: info coreutils 'su invocation'
示例:
变更帐号为babyfish并在执行ls指令后退出变回原使用者:
su -c ls babyfish
变更帐号为root并传入-f选项给新执行的shell:
su root -f
变更帐号为gpadimn并改变工作目录至gpadimn的家目录:
su -gpadimn
2、sudo的使用
大家平时使用su命令切换用户时,有一个明显的安全问题就是一般用户必须知道欲切换用户的密码时才可以成功执行su命令。假设有这样一种情况,管理员希望系统中的某些用户可以使用部分只有管理员才可以使用的命令,这时如果使用使用su命令管理员就必须将自己的密码告诉这些用户,这样显然是不安全的。这时可以通过sudo命令解决这个问题,sudo命令的工作流程如下:
(1)当用户执行sudo命令时,系统会检查/etc/sudoers文件,判断该用户是否有执行sudo命令的权限。
(2)如果用户具有可执行sudo的权限,系统会提示用户“输入用户自己的密码”来确认。
(3)如果密码输入成功,则开始sudo使用指定的用户执行指定的命令。
要注意的是
使用sudo命令时用户输入的是自己的密码,而不是欲切换用户的密码。sudo命令可以使用户通过自己的密码、其他用户的身份执行的工作,而不必知道其他用户的密码。和su命令一样如果sudo命令的是root用户则不需要输入任何密码。
2.1、/etc/sudoers文件
在RHEL 5.x中默认只有root用户用户可以使用sudo命令,如果希望其他用户也可以使用sudo命令,必须
由root用户使用“visudo”命令修改/etc/sudoers文件或直接使用vim编辑/etc/sudoers文件。
提示:
由于root用户对/etc/sudoers文件的权限是只读,所以如果使用vim编辑/etc/sudoers文件后,保存时需要使用“!”强制保存。
/etc/sudoers文件中有一行“root ALL=(ALL) ALL”就是表示root用户可以使用sudo命令切换为任何用户。
如果希望其他用户也可以使用sudo命令可在/etc/sudoers文件中进行配置,配置格式如下。
用户或用户组 可登录的主机 =(可变换的身份)表示可执行的命令
格式说明:
第一栏规定它的适用对象:用户或组,因为系统中的组和用户可以重名,要想指定该规则的适用对象是组而非用户的话,组对象的名称一定要用百分号%开头。
第二栏指定该规则的适用主机。当我们在多个系统之间部署sudo环境时,这一栏格外有用,这里的ALL代表所有主机;对于桌面系统或不想将sudo部署到多个系统的情况,这一栏就换成相应的主机名。
第三栏的值放在括号内,指出第一栏规定的用户能够以何种身份来执行命令。
最后一栏(如/usr/bin/find,/bin/rm)是使用逗号分开的命令表,这些命令能被第一栏规定的用户以第三栏指出的身份来运行它们。需要指出的是,这里列出的命令一定要使用绝对路径。
示例:
在/etc/sudoers文件中增加如下内容后,用户“user1”就可以以root用户的身份执行“chkconfig”命令。
user1 ALL=(root) /sbin/chkconfig
在/etc/sudoers文件中增加如下内容后,用户“user1”就可以以root用户的身份
执行所有命令,而且不需要输入用户“user1”的密码
。“NOPASSWD:”选项表示不需要输入密码。
user1 ALL=(root) NOPASSWD:ALL
在/etc/sudoers文件中增加如下内容后,用户组“gossipgirl”的所有成员就可以以root
用户的身份执行所有命令。在指定用户组时必须使用“%”开头。
%gossipgirl ALL=(root) ALL
在/etc/sudoers文件中还包括以下几个常用选项:
(1)User_Alias,在上面的例子中已经看到可以在/etc/sudoers文件中通过“%”使用系统中已存在的用户组。如果有几个不属于同一个用户组的用户需要使用sudo命令执行一些操作可以通过“User_Alias”选项在/etc/sudoers文件中定义一个组(这个组只在/etc/sudoers文件中有效)。比如在/etc/sudoers文件中增加如下内容后,用户“user1”和“user2”都可以使用root用户的身份执行“chkconfig”命令。
#定义一个名为“TSTGRP”的组,在该组中包括用户“user1”和“user2”。
User_Alias TSTGRP= user1,user2
#“TSTGRP”的组用户可以使用root用户的身份执行“chkconfig”命令。
TSTGRP ALL=(root) /sbin/chkconfig
(2)Cmnd_Alias,如果需要在/etc/sudoers文件多次定义一组命令时可以使用Cmnd_Alias选项。比如在/etc/sudoers文件中增加如下内容后,“TSTCMD”就可以表示“/sbin/chkconfig”和“/sbin/iptables”命令。
#定义一个名为“TSTCMD”的命令别名,该命令别名中包括“/sbin/chkconfig”和
#“/sbin/iptables”命令。
Cmnd_Alias TSTCMD=/sbin/chkconfig, /sbin/iptables
#用户“user1”就可以以root用户的身份执行“TSTCMD”中定义的命令。
user1 ALL=(root) TSTCMD
(3)拒绝命令选项,系统在读取/etc/sudoers文件时会严格匹配命令。可以使用这个特性只允许用户使用sudo命令执行命令的某些选项。比如在/etc/sudoers文件中增加如下内容。
#在/etc/sudoers文件中增加如下内容后,用户“user1”就可以以root用户的身份#执行“iptables”命令,但不允许使用“-nL”选项。
user2 ALL=(root) NOPASSWD:/sbin/iptables,!/sbin/iptables -nL
#在/etc/sudoers文件中增加如下内容后,用户“olivia”就可以以root用户的身份执行
#“passwd 用户名”命令修改其他用户的密码,但不允许使用“passwd”和“passwd root”
#命令。
olivia ALL = NOPASSWD:!/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
2.2、使用sudo命令
[root@localhost babyfish]# sudo -h
sudo - execute a command as another user
usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s] []
usage: sudo -e [-AknS] [-r role] [-t type] [-C fd] [-D level] [-g groupname|#gid] [-p prompt] [-u user name|#uid] file ...
Options:
-a type use specified BSD authentication type
-b run command in the background
-C fd close all file descriptors >= fd
-E preserve user environment when executing command
-e edit files instead of running a command
-g group execute command as the specified group
-H set HOME variable to target user's home dir.
-h display help message and exit
-i [command] run a login shell as target user
-K remove timestamp file completely
-k invalidate timestamp file
-l[l] command list user's available commands
-n non-interactive mode, will not prompt user
-P preserve group vector instead of setting to target's
-p prompt use specified password prompt
-r role create SELinux security context with specified role
-S read password from standard input
-s [command] run a shell as target user
-t type create SELinux security context with specified role
-U user when listing, list specified user's privileges
-u user run command (or edit file) as specified user
-V display version information and exit
-v update user's timestamp without running a command
-- stop processing command line arguments
中文说明:
-b:在后台执行指令;
-h:显示帮助;
-H:将HOME环境变量设为新身份的HOME环境变量;
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s:执行指定的shell;
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
-v:延长密码有效期限5分钟;
-V :显示版本信息。
在完成/etc/sudoers文件的配置后,用户就可以使用sudo命令以其他用户身份执行命令,该命令语法如下。
sudo [-u [<用户名>|#]] 命令
-u [<用户名>|#]:指定执行指定命令的用户,如不指定则表示希望使root用户执行指定命令。
在第一执行sudo命令输入密码后,该密码会保存5分钟,也就在5分钟内再使用sudo命令是可不需要输入密码。
示例:
当前用户是“user1”。
[user1@srv ~]$ id
uid=500(user1) gid=500(user1) groups=500(user1)
使用root用户的身份执行“/sbin/iptables -L”命令。
[user1@srv ~]$ sudo -u root /sbin/iptables -L
Password: #输入密码,注意输入的是用户“user1”的密码,而不是用户root的密码。
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[user1@srv ~]$ sudo -u root /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination