一、Linux的账号与群组
1、关于账号:
Linux上的每个用户和每个文件都有拥有者和群组,那么计算机是如何识别他们的?其实就是利用 UID 与 GID (ID就是一组号码)!每一个文件都会有所 谓的拥有者 ID 与拥有群组 ID ,当我们有要显示文件属性的需求时,系统会依据 /etc/passwd 与 /etc/group 的内容, 找到 UID / GID 对应的帐号与群组名称再显示出来。
Linux中跟使用者帐号有关的有两个非常重要的文件,一个是管理使用者 UID/GID 重要参数的 /etc/passwd ,一个则是专门管理密码相关数据的 /etc/shadow,如果我们要备份Linux的系统账号的话,这两个文件就一定需要备份才行。
- /etc/passwd 文件结构:每一行都代表一个帐号,有几行就代表有几个帐号在你的系统.
每一行使用“:”分隔开,共有七个信息,分别是:
- 帐号名称
- 密码: 早期 Unix 系统的密码就是放在这字段上!但是因为这个文件的特性是所有的程序 都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据 给他改放到 /etc/shadow 中了。所以这里你会看到一个“ x ”。
- UID: 这个就是使用者识别码
- GID: 这个与 /etc/group 有关。
- 使用者信息说明栏
- 主文件夹: 这是使用者的主文件夹
- Shell
- /etc/shadow 文件结构
shadow 同样以“:”作为分隔符号,这九个字段的用途分别是这样的:
- 帐号名称:必须要 与 /etc/passwd 相同才行!
- 密码:这个字段内的数据才是真正的密码,而且是经过编码的密码 (加密)
- 最近更动密码的日期:计算 Linux 日期的时间是以 1970 年 1 月 1 日作为 1 而累加的日期,1971 年 1 月 1 日则为 366
- 密码不可被更动的天数:这个帐号的密码在最近一次被更改后需要经过几天才可以再被变更。
- 密码需要重新变更的天数。
- 密码需要变更期限前的警告天数。
- 密码过期后的帐号宽限时间(密码失效日)。
- 帐号失效日期:此时不论你的密码是否有过期,这个“帐号”都不能再被使用。
- 保留: 最后一个字段是保留的,看以后有没有新功能加入。
如果你想要知道 shadow 是使用哪种加密的机制时, 可以通过下面的方法去查询。
2、关于群组
- /etc/group 文件结构,这个文件就是在记录 GID 与群组名称的对应了。
个文件每一行代表一个群组,也是以冒号“:”作为字段的分隔符号,共分为四栏,每一字段 的意义是:
- 群组名称:基本上需要与第三字段的 GID 对 应。
- 群组密码: 通常不需要设置,这个设置通常是给“群组管理员”使用的,目前很少有这个 机会设置群组管理员。同样的,密码已经移动到 /etc/gshadow 去,因此这个字段只会 存在一个“x”而已;
- GID: 就是群组的 ID
- 此群组支持的帐号名称: 我们知道一个帐号可以加入多个群组,那某个帐号想要加入此 群组时,将该帐号填入这个字段即可。
- 有效群组(effective group)与初始群组(initial group)
/etc/passwd 里面的第四栏的 GID 就是所谓 的“初始群组 (initial group)
- groups: 有效与支持群组的观察
我的 jxl 帐号同时支持 dmtsai, wheel 与 users 这三个群组,第一个输出的群组即为有效群组 (effective group) 。即,如果我以 touch 去创建一个新文件,例如: “ touch test ”,那么这个 文件的拥有者为 jxl ,而且群组也是 jxl 的
- newgrp: 有效群组的切换
用 newgrp 切换的群组必须是你已经有支持的群组。
二、账号管理指令
1、使用者的新增:useradd
- 新增用户:useradd
语法格式:
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 使用者帐号名
选项与参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个帐号;
-g :后面接的那个群组名称就是我们上面提到的 initial group 啦~ 该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G :后面接的群组名称则是这个帐号还可以加入的群组。 这个选项与参数会修改 /etc/group 内的相关数据!
-M :强制!不要创建使用者主文件夹!(系统帐号默认值)
-m :强制!要创建使用者主文件夹!(一般帐号默认值)
-c :这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设置的啦~
-d :指定某个目录成为主文件夹,而不要使用默认值。务必使用绝对路径!
-r :创建一个系统的帐号,这个帐号的 UID 会有限制 (参考 /etc/login.defs)
-s :后面接一个 shell ,若没有指定则默认是 /bin/bash 的
-e :后面接一个日期,格式为“YYYY-MM-DD”此项目可写入 shadow 第八字段, 亦即帐号失效日的设置项目;
-f :后面接 shadow 的第七字段项目,指定密码是否会失效。0为立刻失效, -1 为永远不失效(密码只会过期而强制于登陆时重新设置而已。)
eg1:请用 users 为初始群组,以及 uid 为 1500 来创建一个名为 vbird2 的帐号
使用 useradd 创建了帐号之后,在默认的情况下,该帐号是暂时被封锁 的, 也就是说,该帐号是无法登陆的,
2、passwd为新用户设置密码使之生效
使用 useradd 创建了帐号之后,在默认的情况下,该帐号是暂时被封锁 的,也就是说,该帐号是无法登陆的,直接给他设置新密码就好了,设置密码就使用 passwd。
语法格式:
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 帐号
选项与参数:
--stdin :可以通过来自前一个管线的数据,作为密码输入,对 shell script 有帮助!
-l :是 Lock 的意思,会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;
-u :与 -l 相对,是 Unlock 的意思!
-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。
-n :后面接天数,shadow 的第 4 字段,多久不可修改密码天数
-x :后面接天数,shadow 的第 5 字段,多久内必须要更动密码
-w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
-i :后面接“日期”,shadow 的第 7 字段,密码失效日期
eg1:请 root 给予 vbird2 密码
3、usermod:帐号相关数据的微调。
语法格式:
usermod [-cdegGlsuLU] username
选项与参数:
-c :后面接帐号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些帐号的说明。
-d :后面接帐号的主文件夹,即修改 /etc/passwd 的第六栏;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦!
-f :后面接天数,为 shadow 的第七字段。
-g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
-G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~
-a :与 -G 合用,可“增加次要群组的支持”而非“设置”喔!
-l :后面接帐号名称。亦即是修改帐号名称, /etc/passwd 的第一栏!
-s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
-u :后面接 UID 数字啦!即 /etc/passwd 第三栏的数据;
-L :暂时将使用者的密码冻结,让他无法登陆。其实仅改 /etc/shadow 的密码栏。
-U :将 /etc/shadow 密码栏的 ! 拿掉,解冻!
eg1:修改使用者 vbird2 的说明栏,加上“VBird's test”的说明。
eg2: 使用者 vbird2 这个帐号在 2023/12/31 失效。
4、删除用户 userdel
语法格式:userdel [-r] username
选项与参数: -r :连同使用者的主文件夹也一起删除
eg1:删除 vbird2 ,连同主文件夹一起删除
5、几个一般身份使用者常用的帐号数据变更与查询指令
1)id ,这个指令则可以查询某人或自己的相关 UID/GID 等等的信息
2)finger ,可以查阅很多使用者相关 的信息。不过以新的版本中已经默认不安装这个软件。
上表所示,其实他列出来 的几乎都是 /etc/passwd 文件里面的东西。列出的信息说明如下:
- Login:为使用者帐号,亦即 /etc/passwd 内的第一字段;
- Name:为全名,亦即 /etc/passwd 内的第五字段(或称为注解);
- Directory:就是主文件夹了;
- Shell:就是使用的 Shell 文件所在;
- Never logged in.:figner 还会调查使用者登陆主机的情况!
- No mail.:调查 /var/spool/mail 当中的信箱数据;
- No Plan.:调查 ~vbird1/.plan 文件,并将该文件取出来说明!
eg2:利用 root 创建自己的计划档
3)chfn ,change finger 的意思,其实就是改到第五个字段,该字段里面用多个“ , ”分隔就是了 ![](https://img-blog.csdnimg.cn/9d8ec873bb17480a8c5492b13937c832.png)
6、新增(groupadd)、修改(groupmod)与移除(groupdel)群组。
- groupadd
语法格式:groupadd [-g gid] [-r] 群组名称
选项与参数:
-g :后面接某个特定的 GID ,用来直接给予某个 GID
-r :创建系统群组!与 /etc/login.defs 内的 GID_MIN 有关。
- groupmod
语法格式:groupmod [-g gid] [-n group_name] 群组名
选项与参数:
-g :修改既有的 GID 数字;
-n :修改既有的群组名称
- groupdel
语法格式:groupdel [groupname]
- gpasswd
语法格式:gpasswd [-ad] user groupname
选项与参数:
-a :将某位使用者加入到 groupname 这个群组当中!
-d :将某位使用者移除出 groupname 这个群组当中。
三、用 ACL 进行主机的细部权限规划
ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细部权限设置。ACL 可以针对单一使用者,单一文件或目录来 进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助。
查看系统核心是否支持acl
1、ACL 的设备指令:getfacl、setfacl
- setfacl:设置某个目录/文件的 ACL 规范。
语法格式:setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
选项与参数:
-m :设置后续的 acl 参数给文件使用,不可与 -x 合用;
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除“所有的” ACL 设置参数;
-k :移除“默认的” ACL 参数,关于所谓的“默认”参数于后续范例中介绍;
-R :递回设置 acl ,亦即包括次目录都会被设置起来;
-d :设置“默认 acl 参数”的意思!只对目录有效,在该目录新建的数据会引用此默认值
eg1:针对单一用户设置规范:“ u:[使用者帐号列表]:[rwx] ”,例如针对 vbird1 的权限规范 rx
eg2: 针对单一群组的权限设置:“ g:群组名:权限 ”,例如针对 mygroup1 的权限规范 rx :
eg3:针对有效权限 mask 的设置方式:“ m:[rwx] ”,例如针对刚刚的文件规范为仅有 r
有效权限 mask 的意思是,使用者或群组所设置的权限必须要存在于 mask 的权限设置范围内才会生效。
eg4:针对默认权限的设置方式:“ d:[ug]:使用者列表:[rwx] ”,例如让 myuser1 在 /srv/projecta 下面一直具有 rx 的默认权限.
eg5:取消全部的 ACL 设置可以使用 -b 来处理,但单一设置值的取消,就得要通 过 -x
- getfacl:取得某个文件/目录的 ACL 设置项目;
语法格式:getfacl filename
eg1:请列出刚刚我们设置的 acl_test1 的权限内容:
四、切换系统登陆用户
1、su:身份切换指令。
语法格式:su [-lm] [-c 指令] [username
选项与参数:
- :单纯使用 - 如“ su - ”代表使用 login-shell 的变量文件读取方式来登陆系统; 若使用者名称没有加上去,则代表切换为 root 的身份。
-l :与 - 类似,但后面需要加欲切换的使用者帐号!也是 login-shell 的方式。
-m :-m 与 -p 是一样的,表示“使用目前的环境设置,而不读取新使用者的配置文件”
-c :仅进行一次指令,所以 -c 后面可以加上指令!
eg1:假设你原本是 dmtsai 的身份,想要使用 non-login shell 的方式变成 root
eg2:使用 login shell 的方式切换为 root 的身份并观察变量
2、sudo:以其他用户的身份执行指令(始系统默认仅有 root 可以执行 sudo)
语法格式:sudo [-b] [-u 新使用者帐号]
选项与参数:
-b :将后续的指令放到背景中让系统自行执行,而不与目前的 shell 产生影响
-u :后面可以接欲切换的使用者,若无此项则代表切换身份为 root 。
eg1:以 sshd 的身份在 /tmp 下面创建一个名为 mysshd 的文件
五、Linux 主机上的使用者讯息传递
1、查询使用者: w, who, last。
2、使用者对谈: write, mesg, wall
不想要接受任何讯息,直接下达这个动作:
如果想要解开的话,再次下达“ mesg y ”就好了,想要知道目前的 mesg 状态,直接 下达“ mesg ”即可。
对所有 系统上面的使用者传送简讯 (广播):wall
3、邮箱:mail
语法格式:mail -s "邮件标题" username@localhost ”即可
查看收件信息:mail
六、创建多个账号。
如果想要创建多个账户,只有通过shell scropt了。下面是一个创建多账号的脚本可以借鉴一二。
- 脚本
#!/bin/bash
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# 0\. userinput
usergroup="" # if your account need secondary group, add here.
pwmech="openssl" # "openssl" or "account" is needed.
homeperm="no" # if "yes" then I will modify home dir permission to 711
# 1\. check the accountadd.txt file
action="${1}" # "create" is useradd and "delete" is userdel.
if [ ! -f accountadd.txt ]; then
echo "There is no accountadd.txt file, stop here."
exit 1
fi
[ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt)
for username in ${usernames}
do
case ${action} in
"create")
[ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " |
| usegrp=""
useradd ${usegrp} ${username} # 新增帐号
[ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -b
ase64 6) || usepw=${username}
echo ${usepw} | passwd --stdin ${username} # 创建密码
chage -d 0 ${username} # 强制登陆修改密码
[ "${homeperm}" == "yes" ] && chmod 711 /home/${username
}
echo "username=${username}, password=${usepw}" >> outputpw.txt
;;
"delete")
echo "deleting ${username}"
userdel -r ${username}
;;
*)
echo "Usage: $0 [create|delete]"
;;
esac
done
"accountadd.sh" [新] 36L, 1250C 已写入