Linux su和sudo

su和sudo这两个命令是linux运维必须要会的,通常在生产环境中都是使用普通帐号来登录,再使用su或sudo来执行一些管理命令 。
su命令su:run a shell with substitute user and group ids
-,-l,--login 切换后使用指定用户的的shell 。
[root@ns2 ~]# su - user4[user4@ns2 ~]$ // 这里的shell环境是user4的[user4@ns2 ~]$ exitlogout[root@ns2 ~]# su -l user4[user4@ns2 ~]$[user4@ns2 ~]$ exitlogout[root@ns2 ~]#-c,--command=COMMAND 可以在不切换当前shell的情况下,用指定的用户来执行一个命令;
[root@ns2 ~]# su user4 -c 'whoami'user4[root@ns2 ~]#如果在su的时候没有加”-“或“-l”或“--login”那么默认的会使用当前用户的shell来执行;
sudo命令sudo的配置文件是:/etc/sudoers,该文件可以定义哪个用户可以在哪个机器上以哪个用户的身份来执行哪些命令;
在配置sudo时必须使用visudo来编辑配置文件,因为使用visudo可以检查修改后的文件的语法是否正确;
who where=(run_as) /path/to/command1,…可以将上面的配置行分成四部分:part1 part2 part3 part4

  • part1:表示哪个用户
  • part2:表示运行该sudo命令的机器,也就是用户执行命令的机器;可以使用ALL来匹配所有;
  • part3:表示该用户要切换到的目标用户;
  • part4:表示要执行的命令;这里的命令必须使用绝对路径,如果只指定了一个目录的话,那么该用户就可以执行该目录下的所有的文件;
例如:
xfzhou 192.168.1.0/24=(root) /usr/sbin/useradd,/usr/sbin/usermodxfzhou ALL=(root) /usr/sbin/setup那么如果用户的数量过多的时候是不是要为每个用户来创建一个条目呢,很显示这样做是不科学的 。所以sudo就引入了别名的概念,其实和组也差不多;
sudoers中定义了四种alias:
  • User_Alias
  • Runas_Alias
  • Host_Alias
  • Cmnd_Alias
alias定义的语法:
Alias_Type NAME = item1,item2,…要注意的是,这个Alias的名称一定要大写;
User_Alias ADMIN = user1,%user2user1是一个用户,user2是一个组,所以user2的前面要加上%
Host_Alias PERMIT = www.xfzhou.com,192.168.10.40,192.168.20.0/24可以使用主机名,IP地址,网段(网段的掩码可以写成255.255.255.0,也可以写成/24)
Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/user/sbin/usermod命令必须使用绝对路径 。如果只指定了一个目录,那么用户就可以执行该目录下的所有的文件;上面的“=”右边的都可以使用“!”来取反 。表示除了xxx以外;
例子:请允许user1,user2,user3在192.168.20.44和192.168.10.0/24网段的机器上使用sudo切换到root用户来执行useradd和setup命令;
#test for sudoUser_Alias TEST_USERS = user1,user2,user3Host_Alias PERMIT_HOST = 192.168.10.0/24,192.168.20.44Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/usr/sbin/setupTEST_USERS PERMIT_HOST=(root) CREATEUSER然后就可以使用user1,user2,user3这三个用户去测试了;
普通用户查看自己可以使用的sudo命令:[user1@ns2 ~]$ sudo -lMatching Defaults entries for user1 on this host:requiretty, !visiblepw, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS MAIL PS1 PS2QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAMELC_NUMERIC LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"Runas and Command-specific defaults for user1:User user1 may run the following commands on this host:(root) /usr/sbin/useradd, /usr/sbin/setup[user1@ns2 ~]$注意:当用户第一次执行sudo命令的时候是需要用户输入自己的密码的 。当第一次输入正确后,这个密码就会被缓存5分钟,在5分钟内用户再次使用sudo来切换身份执行命令的时候就不需要再次输入自己的密码 。
这样呢有些时候会有一个安全隐患,所以为了去掉这个5分钟,可以在使用sudo命令的时候加上“-k”参数,这样用户在每次执行sudo命令的时候都会让用户输入自己的密码 。
sudo无密码执行命令如果想让某个用户在执行sudo的时候不需要输入自己的密码,那么可以在命令的前面添加NOPASSWD 。/etc/sudoers的内容如下:
#test for sudoUser_Alias TEST_USERS = user1,user2,user3Host_Alias PERMIT_HOST = 192.168.10.0/24,192.168.20.44Cmnd_Alias CREATEUSER = /usr/sbin/useradd,/usr/sbin/setupTEST_USERS PERMIT_HOST=(root) NOPASSWD:CREATEUSER


推荐阅读