1 su与su - 的区别
1.1命令说明
su对应是是no-login shell的方式进行账号登陆,命令行的变量配置还是切换账号前的变量。
su-对应的是login shell的方式进行账号登陆,这时候相当于完全登陆新的账号获取新的账号的变量信息
因此在写脚本的过程中,根据里面变量的配置,要合理选用“su” 或者“su -”。附上鸟哥书中关于no-login shell与login shell的讲解
login shell:取得 bash 时需要完整的登陆流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登陆,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』啰;
non-login shell:取得 bash 接口的方法不需要重复登陆的举动,举例来说,(1)你以 X window 登陆 Linux 后, 再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号与密码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达 bash 这个命令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell 。
1.2下面通过命令方式验证二者的区别
#登陆前先查看下环境变量 [[email protected] ~]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin [[email protected] ~]$ su 密码: #使用su登陆后的环境变量,没有变化,依旧是登陆前的信息 root.user:echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin root.user:exit exit #退出,使用su -进行登陆 [[email protected] ~]$ su - 密码: 上一次登录:六 9月 19 09:18:42 HKT 2015pts/2 上 #此时环境变量切换为新登陆用户的变量,所以得出su 与 su -二者是有区别的 root.~:echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin root.~:exit 登出
2 sudo命令与sudoers文件中命令执行顺序问题
今天使用visudo编辑自定义修改密码权限,命令如下:
## custom by lizhaoxian test User_Alias USERTEST = lizhaoxian,pro1,myuser1 Cmnd_Alias CMDTEST = !/usr/bin/passwd, /usr/bin/passwd [a-zA-Z0-9]*, !/usr/bin/passwd root USERTEST ALL=(root) CMDTEST
修改!/usr/bin/passwd, /usr/bin/passwd [a-zA-Z0-9]*, !/usr/bin/passwd root
里面这三个逗号分隔的命令,后面两个命令顺序改变后,依旧可以更改root的密码,比较奇怪,搜索网络原来,是执行顺序的问题。网友答案如下:
#The sudoers line is read in from left to right, with the right most stuff overriding the left.
#意思是:Sudoers命令从左向右读取执行,右面的命令总会覆盖左侧的命令
3 sudoers文件自定义详解
1 /etc/sudoers 配置文件中别名规则
别名规则定义格式如下:
Alias_Type NAME = item1, item2, ...或
Alias_Type NAME = item1, item2, item3 : NAME = item4, item5
别名类型(Alias_Type):别名类型包括如下四种
Host_Alias 定义主机别名;
User_Alias 用户别名,别名成员可以是用户,用户组(前面要加%号)
Runas_Alias 用来定义runas别名,这个别名指定的是“目的用户”,即sudo 允许切换至的用户;
Cmnd_Alias 定义命令别名;
2 范例
1User_Alias SYSADER=beinan,linuxsir,%beinan
2User_Alias DISKADER=lanhaitun
3Runas_Alias OP=root
4Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
5Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 注:定义命令别名DSKCMD,下有成员parted和fdisk ;
6SYSADER ALL= SYDCMD,DSKCMD
7DISKADER ALL=(OP) DSKCMD
注解:
第一行:定义用户别名SYSADER 下有成员 beinan、linuxsir和beinan用户组下的成员,用户组前面必须加%号;
第二行:定义用户别名 DISKADER ,成员有lanhaitun
第三行:定义Runas用户,也就是目标用户的别名为OP,下有成员root
第四行:定义SYSCMD命令别名,成员之间用,号分隔,最后的!/usr/bin/passwd root 表示不能通过passwd 来更改root密码;
第五行:定义命令别名DSKCMD,下有成员parted和fdisk ;
第 六行: 表示授权SYSADER下的所有成员,在所有可能存在的主机名的主机下运行或禁止 SYDCMD和DSKCMD下定义的命令。更为明确遥说, beinan、linuxsir和beinan用户组下的成员能以root身份运行 chown 、chmod 、adduser、passwd,但不能 更改root的密码;也可以以root身份运行 parted和fdisk ,本条规则的等价规则是;
beinan,linuxsir,%beinan ALL=/bin/chown,/bin/chmod,/usr/sbin/adduser,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root,/sbin/parted,/sbin/fdisk
第七行:表示授权DISKADER 下的所有成员,能以OP的身份,来运行 DSKCMD ,不需要密码;更为明确的说 lanhaitun 能以root身份运行 parted和fdisk 命令;其等价规则是:
lanhaitun ALL=(root) /sbin/parted,/sbin/fdisk
3 通配符的支持
通配符(又称meta字符)
sudo允许在sudoers中的路径名和命令行参数中使用shell风格的通配符.通配符匹配是通过POSIX的fnmatch标准程序实现的.注意,这不是正则表达式.
* 匹配任意一组零个或者多个字符
? 匹配任意一个字符
[…] 匹配任意一个在大括号中指定范围里的字符
[!…] 匹配任何一个不在大括号中指定范围里的字符
\x 任意一个字符”x”识别为单纯的”x”.这用来转义像”*”,”?”,”[”,”]”和”}”这样的一些特殊字符
注意,路径名中的通配符不会匹配正斜线(”/”).在匹配命令行参数时,因为斜线不被通配符匹配,这使/usr/bin/*匹配/usr/bin/who而不匹配/usr/bin/X11/xterm.
通配符规则的例外
参考:
1 鸟哥的Linux私房菜第三版
3 [转]sudoers—一个关于哪些用户可以执行哪些命令的列表