码迷,mamicode.com
首页 > 系统相关 > 详细

Linux 中su和sudo命令的几个注意点

时间:2015-09-19 13:47:02      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:

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下面通过命令方式验证二者的区别
#登陆前先查看下环境变量
[user@localhost ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
[user@localhost ~]$ 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 -进行登陆
[user@localhost ~]$ 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私房菜第三版

2 /etc/sudoers配置文件详解

3 [转]sudoers—一个关于哪些用户可以执行哪些命令的列表

Linux 中su和sudo命令的几个注意点

标签:

原文地址:http://www.cnblogs.com/lizhaoxian/p/4821347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!