第2章 系统用户/组管理(2) su和sudo



本文目录:

2.1 su

2.2 sudo

2.2.1 /etc/sudoers文件

2.2.2 sudo和sudoedit命令


2.1 su

切换用户或以指定用户运行命令。

使用su可以指定运行命令的身份(user/group/uid/gid)。

为了向后兼容,su默认不会改变当前目录,且仅设置HOME和SHELL这两个环境变量(若目标用户非root,则还设置USER和LOGNAME环境变量)。推荐使用--login选项(即"-"选项)避免环境变量混乱。

su [options...] [-] [user [args...]]
选项说明:
-c command:使用-c选项传递要指定的命令到shell上执行。使用-c执行命令会为每个su都分配新的会话环境
-, -l, --login:启动shell作为登录的shell,模拟真正的登录环境。它会做下面几件事:
                1.清除除了TERM外的所有环境变量
                2.初始化HOME,SHELL,USER,LOGNAME,PATH环境变量
                3.进入目标用户的家目录
                4.设置argv[0]为"-"以便设置shell作为登录的shell
                  使用--login的su是交互式登录。不使用--login的su是非交互式登录(除不带任何参数的su外
-m, -p, --preserve-environment:保留整个环境变量(不会重新设置HOME,SHELL,USER和LOGNAME),
                                保留环境的方法是新用户shell上执行原用户的各配置文件,如~/.bashrc。
                                当设置了--login时,将忽略该选项
-s SHELL:运行指定的shell而非默认shell,选择shell的顺序优先级如下:
                1.--shell指定的shell
                2.如果使用了--preserve-environment,选择SHELL环境变量的shell
                3.选项目标用户在passwd文件中指定的shell
                4./bin/sh

注意:

(1). 若su没有给定任何参数,将默认以root身份运行交互式的shell(交互式,所以需要输入密码),即切换到root用户,但只改变HOME和SHELL环境变量。

(2). su - username是交互式登录,要求密码,会重置整个环境变量,它实际上是在模拟真实的登录环境。

(3). su username是非交互登录,不会重置除HOME/SHELL外的环境变量。

例如:用户wangwu家目录为/home/wangwu,其shell为/bin/csh。

shell> head -1 /etc/passwd ; tail -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
wangwu:x:2002:2002::/home/wangwu:/bin/csh

首先su到wangwu上,再执行一个完全不带参数的su。

shell> su - wangwu        # 使用su - username后,以登录shell的方式模拟登录,会重新设置各环境变量。su - username是交互式登录

shell> env | egrep -i ‘^home|^shell|^path|^logname|^user‘
HOME=/home/wangwu
SHELL=/bin/csh
USER=wangwu
LOGNAME=wangwu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin
PWD=/home/wangwu
shell> su        # 不带任何参数的su,是交互式登录切换回root,但只会改变HOME和SHELL环境变量

shell> env | egrep -i ‘^home|^shell|^path|^logname|^user|^pwd‘
SHELL=/bin/bash
USER=wangwu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin
PWD=/home/wangwu
HOME=/root
LOGNAME=wangwu
shell> su  -              #  su - 的方式切换回root
Password:

shell> env | egrep -i ‘^home|^shell|^path|^logname|^user|^pwd‘
SHELL=/bin/bash
USER=root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
shell> su wangwu        # 再直接su username,它只会重置SHELL和HOME两个环境变量,其他的环境变量是保持不变的
shell> env | egrep -i ‘^home|^shell|^path|^logname|^user|^pwd‘
SHELL=/bin/csh
USER=wangwu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/home/wangwu
LOGNAME=wangwu

在某些环境下或脚本中,可能需要临时切换身份执行命令,注意这时候的环境变量是否会改变,否则很可能报错提示命令找不到。

2.2 sudo

sudo可以让一个用户以某个身份(如root或其他用户)执行某些命令,它隐含的执行方式是切换到指定用户再执行命令,因为涉及到了用户的切换,所以环境变量是否重置是需要设置的。

sudo支持插件实现安全策略。默认的安全策略插件是sudoers,它是通过/etc/sudoers或LDAP来配置的。

安全策略是控制用户使用sudo命令时具有什么权限,但要注意,安全策略可能需要用户进行身份认证,如密码认证的机制或其他认证机制,如果开启了认证要求,则在指定时间内未完成认证时sudo会退出,默认超时时间为5分钟。

安全策略支持对认证进行缓存,使得在一定时间内该用户无需再次认证就可以执行sudo命令,默认缓存时间为5分钟,sudo -v可以更新认证缓存。

sudo支持日志审核,可以记录下成功或失败的sudo。

2.2.1 /etc/sudoers文件

该文件里主要配置sudo命令时指定的用户和对应的权限。

shell> visudo     # 以下选取的是部分行
## hostname or IP addresses instead.   # 主机别名Host_Alias
# Host_Alias     FILESERVERS = fs1, fs2
# Host_Alias     MAILSERVERS = smtp, smtp2

## User Aliases           # 用户别名User_Alias
# User_Alias ADMINS = jsmith, mikem

## Command Aliases        # 命令别名
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
# Cmnd_Alias LOCATE = /usr/bin/updatedb

root    ALL=(ALL)       ALL   # sudo权限的配置
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
## Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL

在这个文件里,主要有别名(用户别名,主机别名,命令别名)的配置和sudo权限的配置。

安全策略配置格式为:

用户名  主机名=(可切换到的用户身份)  权限和命令

①         ②                ③                     ④

①用户名:可以用组,只需在组名前加个百分号%表示。

②主机名:表示该用户可以在哪些主机上运行sudo,可以用hostname也可以用ip指定。

③可切换的用户身份,即指定执行命令的用户,也可以用组。

④权限和命令:允许执行和不允许执行的命令(多个命令间用逗号分隔)和特殊权限,命令可以带其选项及参数。命令要写绝对路径。不允许执行的命令需要在命令前加上"!"来表示。可以使用标签,如NOPASSWD标签表示切换或以指定用户执行该标签后的命令时不需要输入密码。一行写不下时可使用"\"续行。

标签使用方法:

NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/userdel

它表示useradd命令不需要输入密码,而userdel需要输入密码。

对于别名,相当于用户对于用户组。权限配置处都可以使用别名,即①②③④处都能使用别名来配置。

例如,主机别名里设置多个主机,以后在②位置处直接使用主机别名。

FILESERVERS = fs1, fs2

以下是某设置示例:

DEFAULT=/bin/*,/sbin/ldconfig,/sbin/ifconfig,/usr/sbin/useradd,/usr/sbin/userdel,/bin/rpm,/usr/bin/yum,/sbin/service,/sbin/chkconfig,sudoedit /etc/rc.local,sudoedit /etc/hosts,sudoedit /etc/ld.so.conf,/bin/mount,sudoedit /etc/exports,/usr/bin/passwd [!-]*,!/usr/bin/passwd root,/bin/su - [!-]*,!/bin/su - root,!/bin/su root, /bin/bash, /usr/sbin/dmidecode, /usr/sbin/lsof, /usr/bin/du, /usr/bin/python, /usr/sbin/xm,sudoedit /etc/profile,sudoedit /etc/bashrc,/usr/bin/make,sudoedit /etc/security/limits.conf,/etc/init.d/*,/usr/bin/ruby

ABC ALL=(ALL)NOPASSWD:DEFAULT

其中上面的"/usr/bin/passwd [!-]*"表示允许修改加参数的密码。"/bin/su - [!-]*"表示允许"su -"到某用户下,但必须给参数。

2.2.2 sudo和sudoedit命令

当sudo执行指定的command时,它会调用fork函数,并设置命令的执行环境(如某些环境变量),然后在子进程中执行command,sudo的主进程等待命令执行完毕,然后传递命令的退出状态码给安全策略并退出。

sudoedit等价于sudo -e,它是以sudo的方式执行文件编辑动作。

sudo [options] [command]
选项说明:
-b             :(background)该选项告诉sudo在后台执行指定的命令。
                   注意,如果使用该选项,将无法使用任务计划(job)来控制维护这些后台进程,
                   需要交互的命令应该考虑是否真的要后台,因为可能会失败
-l[l] [command]:当单独使用-l选项时,将列出(list)用户可执行和被禁止的命令。
                          当配合command时,且该command是被允许执行的命令,将列出命令的全路径及该命令参数。
                          如果command是不被允许执行的,则sudo直接以状态码-1退出。
                          可以指定多个字母"l"来显示更详细的格式
-n             :使得sudo变成非交互模式,但如果安全策略是要求输入密码的,则sudo将报错
-S             :(stdin)该选项使得sudo从标准输入而非终端设备上读取密码,给定的密码必须在尾部加上换行符
-s [command]   :(shell)指定要切换到的shell,如果给定command,则在此shell上执行该命令
-U user        :(other user)配合-l选项来指定要列出哪个用户的权限信息
-u user        :(user)该选项明确指定要以此处指定的用户而非root来运行command。
                     若使用uid的方式指定用户,则需要使用"#uid",但很多时候可能需要对"#"使用"\"转义,即使用"\#uid"
-E               :(environment)该选项告诉sudo在执行命令时保留自己的环境变量,保留环境变量的方式是执行环境配置文件。
                     但因为跨了用户,所以很可能某些家目录下的环境配置文件会因为无权限而执行失败,此时sudo将报错
-k [command]   :当单独使用-k选项时,sudo将使得用户的认证缓存失效。下次执行sudo命令需要输入密码。
                           当配合command时,-k选项将忽略用户的缓存,所以sudo将要求用户输入密码,但这次输入密码不会更新认证缓存
                           但执行-k选项本身,不需要密码
-K             :(sure kill)类似于-k选项,但它会完全移除用户的认证缓存,且不会配合command,执行-K本身不需要密码
-v             :(validate)该选项使得sudo更新用户认证缓存
--             :暗示sudo命令行参数到此结束

在sudo上可以直接设置环境变量,它会传递为command的环境。设置的方式为var=value,如LD_LIBRARY_PATH=/usr/local/pkg/lib

由于sudo默认的安全策略插件是sudoers,所以当用户执行sudo时,系统会自动去寻找/etc/sudoers文件(该文件里被root配置了用户对应的权限,也即安全策略),查看sudo要使用的用户是否有对应的权限,如果有则执行,如果没有权限就失败退出sudo。

转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/7011669.html

时间: 2024-10-18 18:25:52

第2章 系统用户/组管理(2) su和sudo的相关文章

第2章 系统用户/组管理

2.1 用户和组的基本概念 用户和组是操作系统中一种身份认证资源. 每个用户都有用户名.用户的唯一编号uid(user id).所属组及其默认的shell,可能还有密码.家目录.附属组.注释信息等. 每个组也有自己的名称.组唯一编号gid(group id).一般来说,gid和uid是可以不相同的,但绝大多数都会让它们保持一致,大致属于约定俗成类的概念吧. 组分为主组(primary group)和辅助组(secondary group)两种,用户一定会属于某个主组,也可以同时加入多个辅助组.

Linux查找过滤及用户/组管理

1.        列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. who | cut –d ' ' –f1 | uniq 2.        取出最后登录到当前系统的用户的相关信息. who | tail -1 who | head -1 3.        取出当前系统上被用户当作其默认shell的最多的那个shell cut –d : -f7 /etc/passwd | uniq –c | sort  -n | tail -1 4.        将

SaltStack与Python配合实现系统用户自动化管理

背景需求: 随意业务的发展,服务器数据也是越来越多,开发人员,运维人员也是越来越多.这时候如果有大量的人需要登录到服务器的话,那么我们就很有必要对用户进行管理.传统的方式是登录到每台服务器创建一个用户,工作重复性太大,如果有 1000台怎么办?甚至有的公司用户都不创建直接让所有人以root登录,这样更危险!!!,那么聪明一点的运维人员会写个创建用户的脚本来实现半自动化的创建用户.这些方法都不适合管理大批量的机器,接下来给大家带来其于SaltStack和Python脚本实现的自动化用户管理. 实现

用户切换命令:su 与 sudo

SU su 切换用户 su - 用户名 是彻底 切换用户-c 以当用户身份执行"这条命令 /etc/skel 模板文件"!$ " 上条命令的最后参数 SUDO sudo 可以让普通用户临时指定root用户的身份执行visudo 命令实际上打开的是-> /etc/sudoers 配置文件root ALL = ( ALL ) ALL用户 被管理主机的地址= 可用的身份 授权命令 (绝对路径)huige ALL = ( ALL ) /usr/sbin/shutdown -h

第五章-系统用户与用户组管理

#-----------------------认识/etc/passwd和/etc/shadow--------------------- 这两个文件可以说是linux系统中最重要的文件之一.如果没有这两个文件或者这两个文件出问题,则你是无法正常登录linux系统的. [[email protected] ~]# cat /etc/passwd | head root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin dae

第二章:用户登录管理模块

本章简介 1.项目分层 2.创建MyHibernateSessionFactory 3.设计用户接口和实现类 4.设计所有Action父类 5.设计用户Action类 6.页面调用 7.完成显示登录成功用户名和注销功能 8.显示报错信息 1.项目分层 实体层(模型层):entity包 学生类.用户类 数据库层(模型层):db包 接口层(模型层):service包 接口实现层(模型层):service.impl包 动作层(控制层):action包 Jsp页面(视图层):整个项目所有的JSP页面 2

用户和密码配置文件、用户管理、组管理

用户和密码配置文件 useradd 用户名:增加一个用户. /etc/passwd:用户的配置文件,包含了所有用户的信息.每新增一个用户,都会在这个文件中增加一行这个用户的信息. 一共有7列,每一列之间用:分隔开.每一列代表的含义如下: 第一列:用户名 第二列:密码(用x代替,真正的密码存放在/etc/shadow中,只有root用户可以访问) 第三列:UID(普通用户的UID从1000开始,之前的都是系统用户,root用户的UID为0.系统用户用于管理相关服务,登录状态均为/sbin/nolo

【Linux下用户和组管理】 𬤺

原文: http://blog.gqylpy.com/gqy/315 "> ##### 创建用户--useradd . 命令格式:useradd [参数] 用户名 useradd也可写成adduser . 参数如下 -u 指定UID号 -d 指定宿主目录 -e 指定生效时间 -g 指定基本组 -G 指定附加组 -M 不建立宿主目录 -s 指定shell -r 用于删除用户时,同时删除宿主目录 -f 一般用于强制删除用户 . 补充命令: echo '密码' | passwd --stdin

第六章 用户帐号和组管理

第六章 用户帐号和组管理 第一节 用户分类 超级用户 root:x:0:0:root:/root:/bin/bash root x 0 0 root /root /bin/bash 用户名为root x表示有密码 用户ID 组ID 与用户相关的注释 用户主目录 登录系统后执行的第一个程序 普通用户 thomas:x:1000:1000:thomas:/home/thomas:/bin/bash thomas x 1000 1000 thomas /home/thomas /bin/bash 用户