三、用户管理
用户和用户组操作命令
Id、Finger、Pwck
检查/etc/passwd 配置文件内的信息与实际主文件夹是否存在,还可比较/etc/passwd 和/etc/shadow 的信息是否一致,另外如果/etc/passwd 中的数据字段错误也会提示。
Grpck
和 pwck 功能相近,这是检查用户组的。
Groups
newgrp
useradd
usermod
usermod 不仅能改用户的 SHELL 类型,所归属的用户组,也能改用户密码的有效期,还能改登录名。
usermod 最好不要用它来改用户的密码,因为他在/etc/shadow 中显示的是明口令;修改用户的口令最好用 passwd ;
usermod 如此看来就是能做到用户帐号大转移;比如我把用户 A 改为新用户 B;
usermod [-u uid [-o]] [-g group] [-G group,...] [-d 主目录 [-m]] [-s shell] [-c 注释] [-l 新名称] [-f 失效日] [-e 过期日] [-p 密码] [-L|-U] 用户名
usermod 命令会参照命令列上指定的部份修改系统帐号档。下列为 usermod 可选用的参数。
- -c comment:更新用户帐号 password 档中的注解栏,一般是使用 chfn(1)来修改。
- -d home_dir:更新用户新的登入目录。如果给定-m 选项,用户旧目录会搬到新的目录去,如旧目录不存在则建个新的。
- -e expire_date:加上用户帐号停止日期。日期格式为 MM/DD/YY.
- -f inactive_days:帐号过期几日后永久停权。当值为 0 时帐号则立刻被停权。而当值为-1 时则关闭此功能。预设值为-1。
- -g initial_group:更新用户新的起始登入用户组。用户组名须已存在。用户组 ID 必须参照既有的的用户组。用户组 ID 预设值为 1。
- -G group,[...]:定义用户为一堆 groups 的成员。每个用户组使用","区格开来,不可以夹杂空白字元。用户组名同-g 选项的限制。如果用户现在的用户组不再此列,则将用户由该用户组中移除。
- -l login_name:变更用户 login 时的名称为 login_name。其它不变。特别是,用户目录名应该也会跟着更动成新的登入名。
- -s shell: 指定新登入 shell。如此栏留白,系统将选用系统预设 shell。
- -u uid :用户 ID 值。必须为唯一的 ID 值,除非用-o 选项。数字不可为负值。预设为最小不得小于/etc/login.defs 中定义的UID_MIN 值。0 到 UID_MIN 值之间是传统上保留给系统帐号使用。用户目录树下所有的档案目录其 userID 会自动改变。放在用户目录外的档案则要自行手动更动。
警告:usermod 不允许你改变正在线上的用户帐号名称。当 usermod 用来改变 userID,必须确认这名 user 没在电脑上执行任何程序。你需手动更改用户的 crontab 档。也需手动更改用户的 at 工作档。采用 NISserver 须在 server 上更动相关的 NIS 设定。
举个简单的例子,我们在前面说了关于 useradd 的工具,而 usermod 工具和 useradd 的参数差不多;两者不同之处在于useradd 是添加,usermod 是修改;
# 把 linuxfish 用户名改为 fishlinux ,并且把其家目录转移到 /opt/linuxfish ;
usermod -d /opt/linuxfish -m -l fishlinux -U linuxfish
# 查看用户 fishlinux 的家目录下的文件及属主;
ls -la /opt/linuxfish/
'''
drwxr-xr-x 3 fishlinux linuxfish 4096 11 月 5 16:46 .
drwxrwxrwx 29 root root 4096 11 月 5 16:48 ..
-rw-r--r-- 1 fishlinux linuxfish 24 11 月 5 16:46 .bash_logout
-rw-r--r-- 1 fishlinux linuxfish 191 11 月 5 16:46 .bash_profile
-rw-r--r-- 1 fishlinux linuxfish 124 11 月 5 16:46 .bashrc
-rw-r--r-- 1 fishlinux linuxfish 5619 11 月 5 16:46 .canna
-rw-r--r-- 1 fishlinux linuxfish 438 11 月 5 16:46 .emacs-rw-r--r-- 1 fishlinux linuxfish 120 11 月 5 16:46 .gtkrc
drwxr-xr-x 3 fishlinux linuxfish 4096 11 月 5 16:46 .kde
-rw-r--r-- 1 fishlinux linuxfish 0 11 月 5 16:46 mydoc.txt
-rw-r--r-- 1 fishlinux linuxfish 658 11 月 5 16:46 .zshrc
'''
# 查看有关 fishlinux 的记录
more /etc/passwd |grep fishlinux # fishlinux:x:512:512::/opt/linuxfish:/bin/bash
通过上面的例子,我们发现文件的用户组还没有变,如果您想改变为 fishlinux 用户组,如果想用通过 usermod 来修改,就要 先添加 fishlinux 用户组;然后用 usermod -g 来修改 ,也可以用 chown -R fishlinux:fishlinux /opt/finshlinux 来改;
userdel
userdel 很简单,只有一个参数可选 -r ;如果加参数-r ,表示在删除用户的同时,一并把用户的家目录及本地邮件存储的目录或文件也一同删除;
警告: 请不要轻易用-r 参数;他会删除用户的同时删除用户所有的文件和目录,切记;如果用户目录下有重要的文件,在删除前请备份; 其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd 中删除您想要删除用户的记录;但最好不要这样 做,/etc/passwd 是极为重要的文件,可能您一不小心会操作失误;
Groupadd
groupmod
groupdel
删除用户组,语法格式:groupdel 用户组
passwd
passwd 作为普通用户和超级权限用户都可以运行,但作为普通用户只能更改自己的用户密码,但前提是没有被 root 用户锁 定;
如果 root 用户运行 passwd ,可以设置或修改任何用户的密码; passwd 命令后面不接任何参数或用户名,则表示修改当前用户的密码
passwd 几个比较重要的参数
- -k, --keep-tokens:保留即将过期的用户在期满后能仍能使用;
- -d, --delete:删除用户密码,仅能以 root 权限操作;
- -l, --lock:锁住用户无权更改其密码,仅能通过 root 权限操作;
- -u, --unlock:解除锁定;
- -f, --force:强制操作;仅 root 权限才能操作;
- -x, --maximum=DAYS:两次密码修正的最大天数,后面接数字;仅能root 权限操作;
- -n, --minimum=DAYS:两次密码修改的最小天数,后面接数字,仅能root 权限操作;
- -w, --warning=DAYS:在距多少天提醒用户修改密码;仅能root 权限操作;
- -i, --inactive=DAYS:在密码过期后多少天,用户被禁掉,仅能以 root 操作;
- -S, --status:查询用户的密码状态,仅能 root用户操作;
- --stdin read new tokens from stdin (root only)
chage
修改用户密码有效期限的命令;
chage 用语法格式: chage [-l] [-m 最小天数] [-M 最大天数] [-W 警告] [-I 失效日] [-E 过期日] [-d 最后日] 用户
id 工具:
查询用户所对应的UID 和GID 及GID所对应的用户组;
id 工具是用来查询用户信息,比如用户所归属的用户组,UID 和 GID 等;id 用法极为简单;我们举个例子说明一下;
语法格式: id [参数] [用户名]
至于有哪些参数,自己查一下 id --help 或 man id ;如果 id 后面不接任何参数和任何用户,默认显示当前操作用户的用户名、
所归属的用户组、UID 和 GID 等;
实例一:不加任何参数和用户名;
[beinan@localhost ~]$ iduid=500(beinan) gid=500(beinan) groups=500(beinan)
注解:在没有加任何参数的情况下,查询的是当前操作用户的用户名、UID 、GID 和所处的主用户组和附属用户组;在本例
中,用户名是 beinan,UID 是 500,所归属的主用户组是 beinan,GID 是 500 ;
实例二: id 后面接用户名;
如果我们想查询系统中用户的 UID 和 GID 相应的内容,可以直接接用户名,但用户名必须是真实的 ,能在/etc/passwd 中查
到的;
[beinan@localhost ~]$ id linuxsir
uid=505(linuxsir) gid=502(linuxsir) groups=502(linuxsir),0(root),500(beinan)
注解:查询用户 linuxsir 的信息,用户 linuxsir ,UID 为 505,所归属的主用户组是 linuxsir,主用户组的 GID 是 502;同时
linuxsir 用户也是 GID 为 0 的 root 用户组成员,也是 GID 为 500 用户组 beinan 的成员;
这个例子和实例一在用户组方面有所不同,我们在 《Linux 用户(user)和用户组(group)管理概述》 中有提到;用户和
用户组的对应关系,可以是一对一、一对多、多对一、或多对多的交叉关系,请参考之;另外您还需要掌握《用户(user)
和用户组(group)配置文件详解》一文;
2、finger 工具:用来查询用户信息,侧重用户家目录、登录 SHELL 等;
finger 工具侧重于用户信息的查询;查询的内容包括用户名(也被称为登录名 Login),家目录,用户真实的名字(Name)... ...
办公地址、办公电话;也包括登录终端、写状态、空闭时间等;
我们最常用 finger 来查询用户家目录、用户真实名、所用 SHELL 类型、以及办公地址和电话,这是以参数 -l 长格式输出的;
而修改用户的家目录、真实名字、办公地址及办公电话,我们一般要能过 chfn 命令进行;
语法格式:
finger [参数选项] [用户名]
-l 采用长格式(默认),显示由-s 选项所包含的所有信息,以及主目录、办公地址、办公电话、登录 SHELL、邮件状
态、.plan、.project 和.forward;
-m 禁止对用户真实名字进行匹配;
-p 把.plan 和.project 文件中的内容省略;
-s 显示短格式,用户名(也被称为登录名 Login)、真实名字(NAME)、在哪个终端登录(Tty)、写状态、空闲时间(Idle)、
登录时间(Login Time)、办公地点、办公电话等;
至于 finger 有哪些参数,您可以通过 finger --help 或 man finger 来获取,我们在本文中以实例讲述最常用的参数;
实例一:不接任何参数,也不指定查询用户名;默认为加了-s 参数;
[beinan@localhost ~]$ finger
Login Name Tty Idle Login Time Office Office Phone
beinan beinan sun tty1 1:39 Nov 2 08:27
linuxsir linuxsir open tty2 2 Nov 2 10:03 linuxsir o +1-389-866-771
等价命令
[beinan@localhost ~]$ finger -s
注解:不加任何参数,也没有指定查询哪个用户,finger 会以默认以短格-s 来输出登录本机的所有用户的用户名(也被称为
登录名 Login)、真实名字(NAME)、在哪个终端登录(Tty)、写状态、空闲时间(Idle)、登录时间(Login Time)、办公地
点、办公电话等;
在这个例子中,有 beinan 用户登录,真实名字是 beinan sun (这个名字是用户的真实名字,如果在添加用户时没有设置,
是不会显示的),在 tty1 终端登录,空闭时间是 1 分 39 秒,登录时间是 Nov /2/08:27 ,没有办公室名称,没有办公电话;
请对照本例中 beinan 用户记录的解说,我们来看看本例中的 linuxsir 用户信息;应该不难。
关于写状态,如果在 Tty 后面 没有任何输出,表示正在写入,如果有*出现,表示没有写入或被禁止,比如下面的例子,ftp
用户没有通过终端登录系统,因为 Tty 是*,同时 Tty 后面还有一个* ,表示禁止写入或没有写入状态(当用户没有登录时);
[beinan@localhost ~]$ finger -s ftpLogin Name Tty Idle Login Time Office Office Phone
ftp FTP User * * No logins
我们可以以短格式的来查询某个用户信息以短格式输出,比如下面的例子;
[beinan@localhost ~]$ finger -s beinan
实例二:关于长格式的用户信息的输出 -l 参数的实例;
finger -l 如果不加用户名的情况下,可以列出所有通过 tty 登录的用户信息;如果您想查询某个用户,就直接指定用户,可以
指定一个或多个;什么是 tty 登录?如果您在全屏文本界面操作的话,您可以通过按 CTRL+F2 或 CTRL+F3 或 CTRL+F4 等,
以几个不同的用户登录到主机上,您就会看到,每个用户都有不同的 tty;
[beinan@localhost ~]$ finger -l
[beinan@localhost ~]$ finger -l beinan linuxsir 注:可以同时查询几个用户信息,以长格式输出;
[beinan@localhost ~]$ finger beinan
Login: beinan Name: beinan sun
Directory: /home/beinan Shell: /bin/bash
On since Wed Nov 2 08:27 (CST) on tty1 2 hours 29 minutes idle
On since Wed Nov 2 10:50 (CST) on pts/0 from :0.0
No mail.
No Plan.
在本例中,所查询的用户是 beinan,真实名字是 beinan sun ,家目录位于 /home/beinan ,所用 SHELL 类型是 bash ;然
后就是通过哪个终端登录的,登录时间,是不是有 mail ,有 Plan 等;
实例三:参数组合的例子;
[beinan@localhost ~]$ finger -lp beinan
Login: beinan Name: beinan sun
Directory: /home/beinan Shell: /bin/bash
On since Wed Nov 2 08:27 (CST) on tty1 2 hours 36 minutes idle
On since Wed Nov 2 10:50 (CST) on pts/0 from :0.0
No mail.
注解:查询 beinan 用户信息,以长格式输出,并且不输出.Plan 和.Project 的内容;
实例四: finger -s 和 w 及 who 的比较;
对于 finger 就说这么多吧,极为简单的工具,当用到-s 参数时,您最好和 w 和 who 工具对照,看看 finger -s 和 w 及 who
的输出有什么异同,w 和 who 是查询哪些用户登录主机的;而 finger -s 呢,无论是登录还是不登录的用户都可以查;但所查
到的内容侧重有所不同;自己看看例子;
[beinan@localhost ~]$ finger -s
Login Name Tty Idle Login Time Office Office Phone
beinan beinan sun tty1 3:03 Nov 2 08:27
beinan beinan sun pts/0 Nov 2 10:50 (:0.0)
linuxsir linuxsir open tty2 1:26 Nov 2 10:03 linuxsir o +1-389-866-771
[beinan@localhost ~]$ w
11:30:36 up 3:04, 3 users, load average: 0.30, 0.15, 0.10
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
beinan tty1 - 08:27 3:03m 2:52 0.00s /bin/sh /usr/X11R6/bin/startx
linuxsir tty2 - 10:03 1:26m 0.01s 0.01s -bash
beinan pts/0 :0.0 10:50 0.00s 0.16s 0.00s w
[beinan@localhost ~]$ who
beinan tty1 Nov 2 08:27linuxsir tty2 Nov 2 10:03
beinan pts/0 Nov 2 10:50 (:0.0)
3、查询登录主机的用户工具:w 、who 、users
w、who 和 users 工具,是查询已登录当前主机的用户;另外 finger -s 也同样能查询;侧重点不一样;请自己对比着看;毕
竟简单,这里只是介绍 ;
[beinan@localhost ~]$ w
12:09:56 up 3:43, 7 users, load average: 0.16, 0.10, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
beinan tty1 - 08:27 3:42m 3:09 0.00s /bin/sh /usr/X11R6/bin/startx
linuxsir tty2 - 10:03 2:06m 0.01s 0.01s -bash
beinan pts/0 :0.0 11:36 1:09 0.15s 0.15s bash
beinan pts/1 :0.0 11:37 1:12 0.21s 0.21s bash
beinan pts/2 :0.0 12:02 6:52 0.09s 0.09s bash
beinan pts/3 :0.0 12:05 12.00s 0.11s 0.06s ssh xmbnnbdl@linuxsir.org -p 17007
beinan pts/4 :0.0 12:06 0.00s 0.21s 0.00s w
[beinan@localhost ~]$ who
beinan tty1 Nov 2 08:27
linuxsir tty2 Nov 2 10:03
beinan pts/0 Nov 2 11:36 (:0.0)
beinan pts/1 Nov 2 11:37 (:0.0)
beinan pts/2 Nov 2 12:02 (:0.0)
beinan pts/3 Nov 2 12:05 (:0.0)
beinan pts/4 Nov 2 12:06 (:0.0)
[beinan@localhost ~]$ users
beinan beinan beinan beinan beinan beinan linuxsir
4、groups 用户所归属的用户组查询;
groups 用法很简单,就是查询用户所归属哪个或哪些用户组;
语法格式: groups 用户名
实例:
[beinan@localhost ~]$ groups beinan 注:查询 beinan 所归属的用户组;
beinan : beinan 注:beinan 是 beinan 用户组下的成员;
[beinan@localhost ~]$ groups linuxsir 注:查询 linuxsir 用户所归属的用户组;
linuxsir : linuxsir root beinan 注:linuxsir 用户是 linuxsir 用户组、beinan 用户组、root 用户组成员;
groups 主要是查询用户所归属的用户组名,最好和 id 命令相对比;这样对这两个工具都有所了解
相关配置文件
/etc/passwd
/etc/shadow
/etc/gshadow
/etc/group
Linux用户密码策略
Linux 用户密码的有效期,是否可以修改密码可以通过 login.defs 文件控制.对 login.defs 文件修只影响后续
建立的用户,如果要改变以前建立的用户的有效期等可以使用 chage 命令.Linux 用户密码的复杂度可以通过 pam pam_cracklib module 或 pam_passwdqc module 控制,两者不能同时
使用. 个人感觉 pam_passwdqc 更好用.
/etc/login.defs 密码策略
PASS_MAX_DAYS 99999 #密码的最大有效期, 99999:永久有期
PASS_MIN_DAYS 0 #是否可修改密码,0 可修改,非 0 多少天后可修改
PASS_MIN_LEN 5 #密码最小长度,使用 pam_cracklib module,该参数不再有效
PASS_WARN_AGE 7 #密码失效前多少天在用户登录时通知用户修改密码
pam_cracklib 主要参数说明:
tretry=N:重试多少次后返回密码修改错误
difok=N:新密码必需与旧密码不同的位数
dcredit=N: N >= 0:密码中最多有多少个数字;N < 0 密码中最少有多少个数字.
lcredit=N:小宝字母的个数
ucredit=N 大宝字母的个数
credit=N:特殊字母的个数
minclass=N:密码组成(大/小字母,数字,特殊字符)
pam_passwdqc 主要参数说明:
mix:设置口令字最小长度,默认值是 mix=disabled。
max:设置口令字的最大长度,默认值是 max=40。
passphrase:设置口令短语中单词的最少个数,默认值是 passphrase=3,如果为 0 则禁用口令短语。
atch:设置密码串的常见程序,默认值是 match=4。
similar:设置当我们重设口令时,重新设置的新口令能否与旧口令相似,它可以是 similar=permit 允
许相似或 similar=deny 不允许相似。
random:设置随机生成口令字的默认长度。默认值是 random=42。设为 0 则禁止该功能。
enforce:设置约束范围,enforce=none 表示只警告弱口令字,但不禁止它们使用;enforce=users 将
对系统上的全体非根用户实行这一限制;enforce=everyone 将对包括根用户在内的全体用户实行这
一限制。
non-unix:它告诉这个模块不要使用传统的 getpwnam 函数调用获得用户信息,
retry:设置用户输入口令字时允许重试的次数,默认值是 retry=3
密码复杂度通过/etc/pam.d/system-auth 实施
如:
要使用 pam_cracklib 将注释去掉,把 pam_passwdqc.so 注释掉即可.
#password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
password requisite /lib/security/$ISA/pam_passwdqc.so min=disabled,24,12,8,7 passphrase=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
#password requisite /lib/security/$ISA/pam_cracklib.so retry=3 difok=1
新密码至少有一位与原来的不同
PASS_MIN_DAYS 参数则设定了在本次密码修改后,下次允许更改密码之前所需的最少天数。
PASS_WARN_AGE 的设定则指明了在口令失效前多少天开始通知用户更改密码(一般在用户刚刚登陆系统时
就会收到警告通知)。
你也会编辑/etc/default/useradd 文件,寻找 INACTIVE 和 EXPIRE 两个关键词:
INACTIVE=14
EXPIRE=这会指明在口令失效后多久时间内,如果口令没有进行更改,则将账户更改为失效状态。在本例中,
这个时间是 14 天。而 EXPIRE 的设置则用于为所有新用户设定一个密码失效的明确时间(具体格式为“年份-
月份-日期”)。
显然,上述这些设定更改之后,只能影响到新建立的用户。要想修改目前已存在的用户具体设置,
需要使用 chage 工具。
# chage -M 60 joe
这条命令将设置用户 joe 的 PASS_MAX_DAYS 为 60,并修改对应的 shadow 文件。
你可以使用 chage -l 的选项,列出当前的账户时效情况,而使用-m 选项是设置 PASS_MIN_DAYS,用-W
则是设置 PASS_WARN_AGE,等等。chage 工具可以让你修改特定账户的所有密码时效状态。
注意,chage 仅仅适用于本地系统的账户,如果你在使用一个类似 LDAP 这样的认证系统时,该工具
会失效。如果你在使用 LDAP 作为认证,而你又打算使用 chage,那么,哪怕仅仅是试图列出用户密码的时
效信息,你也会发现 chage 根本不起作用。
制定一项策略,定义多长时间一个密码必须进行更改,然后强制执行该策略,是非常不错的一个做
法。在解雇了某个雇员后,口令时效策略会保证该雇员不可能在被解雇 3 个月后发现他的口令依然可用。即
使系统管理员忽略了删除他的帐号,该帐号也会因密码时效策略而被自动锁定。当然,这一点并不能成为不
及时删除该雇员帐号的理由,但是这个策略的确提供了一层额外的安全防护,尤其是在过去常常忽视及时清
理帐号的情况下。
ACL权限设置
ACL 是 Access Control List 的缩写,主要用于在提供传统的 owner、group、others 的 read、write、execute
权限之外进行细部权限设置。
启动ACL
让/目录支持 ACL:
#mount –o remount ,acl /
#mount |grep /
//查看是否有挂载
开机启动 ACL:
将要启动 ACL 的分区写入/etc/fstab 中:
#vi /etc/fstab
/dev/hda5 / ext3 default,acl 1 2
ACL相关命令
Getfacl :取得某个文件/目录的 ACL 权限;
Setfacl :设置某个文件/目录的 ACL 权限;
setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...
setfacl --restore=file
描述
setfacl 用来在命令行里设置 ACL。在命令行里,一系列的命令跟随以一系列的文件名。
选项-m 和-x 后边跟以 acl 规则。多条 acl 规则以逗号(,)隔开。选项-M 和-X 用来从文件或标准输入读取
acl 规则。
选项--set 和--set-file 用来设置文件或目录的 acl 规则,先前的设定将被覆盖。
选项-m(--modify)和-M(--modify-file)选项修改文件或目录的 acl 规则。
选项-x(--remove)和-X(--remove-file)选项删除 acl 规则。
当使用-M,-X 选项从文件中读取规则时,setfacl 接受 getfacl 命令输出的格式。每行至少一条规则,以#
开始的行将被视为注释。当在不支持 ACLs 的文件系统上使用 setfacl 命令时,setfacl 将修改文件权限位。如果 acl 规则并不完全匹
配文件权限位,setfacl 将会修改文件权限位使其尽可能的反应 acl 规则,并会向 standard error 发送错误消息,
以大于 0 的状态返回。
权限
文件的所有者以及有 CAP_FOWNER 的用户进程可以设置一个文件的 acl。(在目前的 linux 系统上,root
用户是唯一有 CAP_FOWNER 能力的用户)
选项
-b,--remove-all
删除所有扩展的 acl 规则,基本的 acl 规则(所有者,群组,其他)将被保留。
-k,--remove-default
删除缺省的 acl 规则。如果没有缺省规则,将不提示。
-n,--no-mask
不要重新计算有效权限。setfacl 默认会重新计算 ACL mask,除非 mask 被明确的制定。
--mask
重新计算有效权限,即使 ACL mask 被明确指定。
-d,--default
设定默认的 acl 规则。
--restore=file
从文件恢复备份的 acl 规则(这些文件可由 getfacl -R 产生)。通过这种机制可以恢复整个目录树的 acl
规则。此参数不能和除--test 以外的任何参数一同执行。
--test
测试模式,不会改变任何文件的 acl 规则,操作后的 acl 规格将被列出。
-R,--recursive
递归的对所有文件及目录进行操作。
-L,--logical
跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P,--physical
跳过所有符号链接,包括符号链接文件。
--version
输出 setfacl 的版本号并退出。
--help
输出帮助信息。
--
标识命令行参数结束,其后的所有参数都将被认为是文件名
-
如果文件名是-,则 setfacl 将从标准输入读取文件名。
ACL 规则
setfacl 命令可以识别以下的规则格式。
[d[efault]:] [u[ser]:]uid [:perms]
指定用户的权限,文件所有者的权限(如果 uid 没有指定)。
[d[efault]:] g[roup]:gid [:perms]
指定群组的权限,文件所有群组的权限(如果 gid 未指定)
[d[efault]:] m[ask][:] [:perms]
有效权限掩码[d[efault]:] o[ther] [:perms]
其他的权限
恰当的 acl 规则被用在修改和设定的操作中。
对于 uid 和 gid,可以指定一个数字,也可指定一个名字。
perms 域是一个代表各种权限的字母的组合:读-r 写-w 执行-x,执行只适合目录和一些可执行的文件。
pers 域也可设置为八进制格式。
自动创建的规则
最初的,文件目录仅包含 3 个基本的 acl 规则。为了使规则能正常执行,需要满足以下规则。
*3 个基本规则不能被删除。
*任何一条包含指定的用户名或群组名的规则必须包含有效的权限组合。
*任何一条包含缺省规则的规则在使用时,缺省规则必须存在。
用法举例如下:
acl 全称 Access Control Lists 翻译成中文叫"访问控制列表",
传统的 Linux 文件系统的权限控制是通过 user、group、other 与 r(读)、w(写)、x(执行) 的不同组合来
实现的。随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。 例如,目录 /data
的权限为:drwxr-x---,所有者与所属组均为 root,在不改变所有者的前提下,要求用户 tom 对该目录有完
全访问权限 (rwx).考虑以下 2 种办法 (这里假设 tom 不属于 root group)
(1) 给 /data 的 other 类别增加 rwx permission,这样由于 tom 会被归为 other 类别,那么他也将拥
有 rwx 权限。
(2) 将 tom 加入到 root group,为 root group 分配 rwx 权限,那么他也将拥有 rwx 权限。
以上 2 种方法其实都不合适,所以传统的权限管理设置起来就力不从心了。
为了解决这些问题,Linux 开发出了一套新的文件系统权限管理方法,叫文件访问控制列表 (Access
Control Lists, ACL)。简单地来说,ACL 就是可以设置特定用户或者用户组对于一个文件的操作权限。
ACL 有两种,一种是存取 ACL (access ACLs),针对文件和目录设置访问控制列表。一种是默认 ACL (default
ACLs),只能针对目录设置。如果目录中的文件没有设置 ACL,它就会使用该目录的默认 ACL.
首先我来讲一下 getfacl ( 显示文件或目录的 ACL)
在我的电脑里首先有一个用户叫 NEU.我们学校的简称.同时还有一个用户,software,我的专业名称.
我以 neu 用户进行操作,在其目录下建立一个文件 fileofneu.
可以看到它的初始权限为-rw-rw-r--然后我把这个文件权限进行下修改.使用的命令为 chmod,修改后的文
件权限为-rw-rw----现在这个文件的权限就不允许其它用户访问了.
然后切换到 sofeware 用户,来证实这个文件的不可访问性.
下面我们就通过 getfacl 命令来查看.这时候得进入 neu 用户下操作了.其命令格式很简单:getfacl fileofneu
权限一目了然.不多介绍了,下面就要用 Setfacl 来进行修改了.使其在对于其它用户的权限里,只对
software 用户只读只写.
setfacl -m u:softeware:rw- fileofneu
setfacl -R -m u:softeware:rw- fileofneu (-R 一定要在-m 前面,表示目录下所有文件)
setfacl -x u:softeware fileofneu (去掉单个权限)
setfacl -b (去掉所有 acl 权限)
如果我们希望在一个目录中新建的文件和目录都使用同一个预定的 ACL,那么我们可以使用默认(Default)
ACL。在对一个目录设置了默认的 ACL 以后,每个在目录中创建的文件都会自动继承目录的默认 ACL 作为自
己的 ACL。用 setfacl 的-d 选项就可以做到这一点:
[root@FC3-vm mnt]# setfacl -d --set g:testg1:rwx dir1
[root@FC3-vm mnt]# getfacl dir1然后用 getfacl 命令来进行查看.我们就可以看到多了一行 user:software:rw- 这说明其对用户 software 开
放了读写的权限.
为了证实其可用性,再切换到 software 用户下访问这个文件,发现与前面不同的是,这回可以读写了.
今天就讲这一个吧,讲多了,大家也记不住.
对了,刚才我进行了一下这个操作,发现进不去,原来是我没有给 software 用户授与访问/home/neu 这个目
录的进入的权力,所以,我们还得应用 setfacl 命令来使得 software 用户拥有进入这个目录的权力.其操作与上
面基本一致。
用户身份切换
Su
命令作用
su 的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
使用方式
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
参数说明
-f , –fast:不必读启动文件(如 csh.cshrc 等),仅用于 csh 或 tcsh 两种 Shell。
-l , –login:加了这个参数之后,就好像是重新登陆一样,大部分环境变量(例如 HOME、SHELL
和 USER 等)都是以该使用者(USER)为主,并且工作目录也会改变。如果没有指定 USER,缺省情况是 root。
-m, -p ,–preserve-environment:执行 su 时不改变环境变数。
-c command:变更账号为 USER 的使用者,并执行指令(command)后再变回原来使用者。
–help 显示说明文件
–version 显示版本资讯
USER:欲变更的使用者账号,
ARG: 传入新的 Shell 参数。
例子
su -c ls root 变更帐号为 root 并在执行 ls 指令后退出变回原使用者。
[user1@centos6 ~]$ su - root -c "head -n 3 /etc/passwd"
对于命令参数要加上引号
su [用户名]
a>在 root 用户下, 输入 su 普通用户. 则切换至普通用户, 从 root 切换到变通用户不需要密码
b>在普通用户下, 输入 su [用户名]
提示 password:
输入用户的 PASSWORD, 则切换至该用户
Sudo
/etc/sudoers 谁能作什么的一个列表,Sudo 能用需要在这个文件中定义
#visudo
增加如下,加%代表用户组,ALL=(ALL)表示登录者的来源主机名,最后的 ALL 代表可执行
的命令。NOPASSWD 代表不需要密码直接可运行 Sudo,限制多命令一定要写绝对路径,用逗号分开,多行用
‘’,用!代表不能执行
%aixi ALL=(ALL) NOPASSWD: ALL
%aixi ALL=(ALL) NOPASSWD: /bin/ls,/bin/mkdir,/bin/rmdir,
/usr/bin/who,!/usr/bin/passwd root查询用户命令
W
可显示开机多久,当前登录的所有用户,平均负载
Who
显示当前登录的所有用户
Last
显示每个用户最后的登录时间
Lastlog
显示每个用户最后的登录时间
usermod 命令会参照命令列上指定的部份修改系统帐号档。下列为 usermod 可选用的参数。 -c comment:更新用户帐号 password 档中的注解栏,一般是使用 chfn(1)来修改。 -d home_dir:更新用户新的登入目录。如果给定-m 选项,用户旧目录会搬到新的目录去,如旧目录不存在则建个新的。 -e expire_date:加上用户帐号停止日期。日期格式为 MM/DD/YY. -f inactive_days:帐号过期几日后永久停权。当值为 0 时帐号则立刻被停权。而当值为-1 时则关闭此功能。预设值为-1。 -g initial_group:更新用户新的起始登入用户组。用户组名须已存在。用户组 ID 必须参照既有的的用户组。用户组 ID 预设值为 1。 -G group,[...]:定义用户为一堆 groups 的成员。每个用户组使用","区格开来,不可以夹杂空白字元。用户组名同-g 选项的限制。如果用户现在的用户组不再此列,则将用户由该用户组中移除。 -l login_name:变更用户 login 时的名称为 login_name。其它不变。特别是,用户目录名应该也会跟着更动成新的登入名。 -s shell: 指定新登入 shell。如此栏留白,系统将选用系统预设 shell。 -u uid :用户 ID 值。必须为唯一的 ID 值,除非用-o 选项。数字不可为负值。预设为最小不得小于/etc/login.defs 中定义的UID_MIN 值。0 到 UID_MIN 值之间是传统上保留给系统帐号使用。用户目录树下所有的档案目录其 userID 会自动改变。放在用户目录外的档案则要自行手动更动。