Linux用户管理
用户管理
添加用户
useradd或者adduser。其实adduser是useradd的一个软连接。以useradd为例,其用法为 useradd [option] USERNAME
1 2 | [root@compute ~] # ll `which adduser` lrwxrwxrwx. 1 root root 7 5 月 26 14 : 21 / usr / sbin / adduser - > useradd |
-u 指定新添加用户的UID,不过根据规定,普通用户的UID必须大于499且不能和已存在的UID重复。
1 2 3 | [root@compute ~] # useradd -u 1010 user1 [root@compute ~] # tail -1 /etc/passwd user1:x: 1010 : 1010 :: / home / user1: / bin / bash |
-g 指定新添加用户的基本组,可以使用GID也可以使用组名来为其指明基本组(可以用id命令来查看用户信息)
1 2 3 | [root@compute ~] # useradd -g root user2 [root@compute ~] # id user2 uid = 1011 (user2) gid = 0 (root) 组 = 0 (root) |
-G 指定新添加的用户的附加组,附加组可以有多个,多个附加组之间用逗号隔开。
1 2 3 | [root@compute ~] # useradd -G user1,root user3 [root@compute ~] # id user3 uid = 1012 (user3) gid = 1012 (user3) 组 = 1012 (user3), 0 (root), 1010 (user1) |
-d 为新添加的用户指定家目录,默认情况下家目录是/home下的与用户名同名的目录。
-M 不为新用户创建家目录。
-s 为新添加的用户指定默认的shell。(系统中有一个nologin的shell可以禁止某账户登入)
1 2 3 | [root@compute ~] # useradd -s /sbin/nologin user4 [root@compute ~] # su user4 This account is currently not available. |
可以使用 echo $SHELL 来查看当前用户的shell
-r 添加新用户为系统用户,系统用户的UID在1-499之间,一般不能登入,没有家目录。
注:该命令添加的用户的部分默认参数(比如用户的默认shell)在/etc/default/useradd文件中。
查看用户信息
用id命令可以查看用户信息,用法:id [option] [USERNAME],不指定用户名时默认用户为当前用户。
-u 查看UID
-g 查看基本组的GID
-G 查看所有组的GIO
-n 和上面的选项组合使用,用于显示名称,而非id号
1 2 3 4 5 6 7 8 | [root@compute ~] # id -u user1 1010 [root@compute ~] # id -un user1 user1 [root@compute ~] # id -G user3 1012 0 1010 [root@compute ~] # id -Gn user3 user3 root user1 |
finger命令也可以查看用户相关信息
1 2 3 4 5 6 | [root@compute ~] # finger user1 Login: user1 Name: Directory: / home / user1 Shell: / bin / bash Never logged in . No mail. No Plan. |
删除用户
使用userdel命令来删除用户,不过值得注意的是userdel命令默认情况下是不会删除用户的家目录。
userdel的用法:userdel [option] USERNAME
-r 同时删除用户的家目录。
1 2 3 4 5 6 7 | [root@compute ~] # ls /home boost compute EasyDrcom libpcap lost + found user1 user2 user3 user4 [root@compute ~] # userdel user1 userdel:组“user1”没有移除,因为它包含其它成员。 [root@compute ~] # userdel -r user2 [root@compute ~] # ls /home boost compute EasyDrcom libpcap lost + found user1 user3 user4 |
修该用户信息
使用usermod来修改用户的账户信息,其用法同useradd。具体实例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@compute ~] # id user3 uid = 1012 (user3) gid = 1012 (user3) 组 = 1012 (user3), 0 (root), 1010 (user1) [root@compute ~] # usermod -u 505 user3 [root@compute ~] # id user3 uid = 505 (user3) gid = 1012 (user3) 组 = 1012 (user3), 0 (root), 1010 (user1) [root@compute ~] # finger user3 Login: user3 Name: Directory: / home / user3 Shell: / bin / bash Never logged in . No mail. No Plan. [root@compute ~] # usermod -g 0 -s /bin/tcsh user3 #这里该的基本组必须事先存在 [root@compute ~] # !id id user3 uid = 505 (user3) gid = 0 (root) 组 = 0 (root), 1010 (user1) [root@compute ~] # !fing finger user3 Login: user3 Name: Directory: / home / user3 Shell: / bin / tcsh Never logged in . No mail. No Plan. |
-l 参数用于修改用户名
1 2 3 | [root@compute ~] # usermod -l u3 user3 [root@compute ~] # id u3 uid = 505 (u3) gid = 0 (root) 组 = 0 (root), 1010 (user1) |
注:如果使用-G为用户修改附加组的话,默认情况下会覆盖原有的附加组,如果只想追加新的附加组可以使用 -aG 其中a表示追加。使用 -d 修改用户家目录的时候最好用再配合 -m 使用,其意思是修改家目录的同时把原来家目录下的文件复制一份到目的家目录。
修改用户的登入shell还可以使用 chsh (change shell)命令。其用法为 chsh USERNAME
可以用pwck来检查用户账号的完整性。
修改用户密码
使用passwd命令来修改用户的密码,用法:passwd [USERNAME]
对于普通用户来说,只能使用passwd命令,用来修改自己的密码。对于管理员来说,不仅可以使用passwd来修改自己的密码,还可以使用passwd USERNAME 命令来修改别人的密码。
passwd可以使用 --stdin 参数来指明从标准输入来获取密码。
1 2 3 4 5 6 7 8 9 | [root@compute ~] # passwd user3 更改用户 user3 的密码 。 新的 密码: 无效的密码: 密码未通过字典检查 - 过于简单化 / 系统化 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 [root@compute ~] # echo "123456789" | passwd user3 --stdin 更改用户 user3 的密码 。 passwd:所有的身份验证令牌已经成功更新。 |
-d 参数可以删除用户的密码。
组管理
组的创建
组的创建使用groupadd命令,可以使用 -g 指定GID,-r表明改组为系统组。具体用法和useradd类似,以下关于组的操作命令的用法均可参考关于用户操作的命令的用法。
组信息修改
groupmod 命令用于修改组信息,-g 修改GID,-n 修改组名。
组的删除
groupdel 命令用于删除一个组
组添加密码
使用 gpasswd 命令用于修改组密码。组密码主要用于临时改变用户所属的组。
比如下面的代码中,user3用户临时使用了user4组创建了一个b.txt文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | [root@compute ~] # usermod -l user3 u3 [root@compute ~] # gpasswd user4 正在修改 user4 组的密码 新密码: 请重新输入新密码: [root@compute ~] # su - user3 上一次登录:五 7 月 28 06 : 29 : 18 CST 2017pts / 1 上 [user3@compute ~]$ touch a.txt [user3@compute ~]$ id uid = 505 (user3) gid = 0 (root) 组 = 0 (root), 1010 (user1) 环境 = unconfined_u:unconfined_r:unconfined_t:s0 - s0:c0.c1023 [user3@compute ~]$ ll 总用量 0 - rw - r - - r - - . 1 user3 root 0 7 月 28 06 : 30 a.txt [user3@compute ~]$ newgrp user4 密码: [user3@compute ~]$ touch b.txt [user3@compute ~]$ id uid = 505 (user3) gid = 1013 (user4) 组 = 1013 (user4), 0 (root), 1010 (user1) 环境 = unconfined_u:unconfined_r:unconfined_t:s0 - s0:c0.c1023 [user3@compute ~]$ ll 总用量 0 - rw - r - - r - - . 1 user3 root 0 7 月 28 06 : 30 a.txt - rw - r - - r - - . 1 user3 user4 0 7 月 28 06 : 31 b.txt [user3@compute ~]$ exit exit [user3@compute ~]$ id uid = 505 (user3) gid = 0 (root) 组 = 0 (root), 1010 (user1) 环境 = unconfined_u:unconfined_r:unconfined_t:s0 - s0:c0.c1023 [user3@compute ~]$ exit logout [root@compute ~] # |
注:上面的newgrp用于临时切换基本组,当这个临时组用完要退出时使用exit命令。
usermod 示例 – 将一个已有用户增加到一个已有用户组中¶
将一个已有用户 cnzhx 增加到一个已有用户组 apache 中,使此用户组成为该用户的附加用户组,可以使用带 -a 参数的 usermod
指令。-a 代表 append, 也就是将用户添加到新用户组中而不必离开原有的其他用户组。不过需要与 -G 选项配合使用:
1 | # usermod -a -G apache cnzhx |
如果要同时将 cnzhx 的主要用户组改为 apache,则直接使用 -g 选项:
1 | # usermod -g apache cnzhx |
如果要将一个用户从某个组中删除,则
1 | gpasswd - d user group |
但是这个时候需要保证 group 不是 user 的主组。
手动创建用户
这部分需要了解linux保存用户的几个配置文件。
/etc/passwd —— 账号文件
/etc/shadow —— 密码文件
/etc/group—— 组信息文件
/etc/gshadow —— 组密码文件
/etc/skel —— 用户默认家目录的备份文件
1 2 | [root@compute demo] # tail -1 /etc/passwd user3:x: 505 : 0 :: / home / user3: / bin / tcsh |
passwd文件中的配置规则如下:
用户名:密码占位符:用户ID:组ID:一般的信息:家目录:默认登入shell
1 2 | [root@compute demo] # tail -1 /etc/passwd user3:x: 505 : 0 :: / home / user3: / bin / tcsh |
shadow文件的配置规则如下:
账号
加密的密码,注意前三个字符 &6& 代表着密码的加密方式,后面会用到。
最后一次修改密码的日期,该位是从1970年1月1号开始到上次密码修改的天数,0表示用户下一次登入需要改密码,空白表示密码年龄功能被禁用。
密码最小年龄,0或空白表示没有最小年龄。
密码最大年龄,空白表示没有密码最大年龄。超过密码最大年龄还未改密码将进入密码警告时间段。
密码警告时间段,该阶段会提示用户修改密码,0或空白表示没有密码警告时间段,超过密码警告时间段将密码禁用期。
密码禁用期,该阶段会强制用户修改密码,不修改就无法登入。空白表示没有禁用期,超过将进入账户过期期。
账户过期期,账户过期后该账户将无法登入,该位与上面的密码禁用期有所不同,密码禁用期超过后用户只要修改密码后就可以重新登入,而账户过期永远无法登入,除非管理员解封。
保留位,该字段保留未用。
group文件的配置规则如下:
1 2 | [root@compute demo] # tail -1 /etc/group user4:x: 1013 : |
组名:密码占位符:组ID:以该组为额外组的组内用户
有上面这些基本知识后现在正式开始手动添加用户
首先添加账户:
1 2 3 4 | [root@compute demo] # echo "user5:x:5000:5000::/home/user5:/bin/bash" >> /etc/passwd [root@compute demo] # tail -1 !$ tail - 1 / etc / passwd user5:x: 5000 : 5000 :: / home / user5: / bin / bash |
添加账户密码(不同的Linux发行版系统使用的密码加密方式不同,加密方式的查看方式见上面红色字体,在我的电脑上为6号加密方式即SHA-512加密):
目前我还没找到能加密sha512(带salt)的加密工具,于是自己用c写了一个加密程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #define _XOPEN_SOURCE #include <unistd.h> #include <stdio.h> #include <string.h> int main() { char salt[ 20 ] = { 0 }; char key[ 100 ] = { 0 }; char tmp[ 20 ]; int id ; int length = 0 ; printf( "please choose the encrypt algorithm:\n" ); printf( "1 : MD5\n" "5 : SHA-256\n" "6 : SHA-512\n" ); scanf( "%d" ,& id ); salt[ 0 ] = '$' ; salt[ 2 ] = '$' ; salt[ 1 ] = id + '0' ; printf( "please input salt(no more than 8 characters):" ); scanf( "%s" ,tmp); length = strlen(tmp); strcpy(salt + 3 , tmp); salt[ 3 + length] = '$' ; printf( "please input the key:" ); scanf( "%s" ,key); printf( "%s\n" ,crypt(key, salt)); return 0 ; } |
编译命令:
1 | [root@compute demo] # gcc encrypt.c -o encrypt -lcrypt |
注:上面的encrypt.c为源文件,encrypt为输出程序,-lcrypt为用到的加密库。
现在可以用这个程序来生成密码了。
1 2 3 4 5 6 7 8 | [root@compute demo] # ./encrypt please choose the encrypt algorithm: : MD5 : SHA - 256 : SHA - 512 please input salt(no more than 8 characters): 1234abcd please input the key:password $ 6 $ 1234abcd $RQ0et4pXYf990f. / lJNcInZtANef5Mw0GSA0ftwDYKZEViukdnf9bM / PALLnGuSv91L / 9bWBkFBQM4Os8CMYk / |
这里我们运用自己写的加密工具生成了一个salt为1234abcd,密码为password的采用SHA-512加密的 加密密码 $6$1234abcd$RQ0et4pXYf990f./lJNcInZtANef5Mw0GSA0ftwDYKZEViukdnf9bM/PALLnGuSv91L/9bWBkFBQM4Os8CMYk/ 。
1 2 3 4 | [root@compute demo] # echo 'user5:$6$1234abcd$RQ0et4pXYf990f./lJNcInZtANef5Mw0GSA0ftwDYKZEViukdnf9bM/PALLnGuSv91L/9bWBkFBQM4Os8CMYk/:17374:0:99999:7:::' >> /etc/shadow [root@compute demo] # tail -1 !$ tail - 1 / etc / shadow user5:$ 6 $ 1234abcd $RQ0et4pXYf990f. / lJNcInZtANef5Mw0GSA0ftwDYKZEViukdnf9bM / PALLnGuSv91L / 9bWBkFBQM4Os8CMYk / : 17374 : 0 : 99999 : 7 ::: |
到此为止添加密码这一步已经做完。
在group中加入其基本组
1 2 3 | [root@compute demo] # echo "user5:x:5000:" >> /etc/group [root@compute demo] # tail -1 /etc/group user5:x: 5000 : |
最后在gshadow中添加组信息(为了方便起见,我们暂时不添加组密码,有兴趣的同学可以自己添加,添加方式和添加用户密码相同,把加密后的密码替换!即可):
1 2 3 4 5 | [root@compute demo] # echo "user5:!::" >> /etc/gshadow - bash: :: unrecognized history modifier [root@compute demo] # echo 'user5:!::' >> /etc/gshadow [root@compute demo] # tail -1 /etc/gshadow user5:!:: |
注:上面可以看到我使用echo "user5:!::" >> /etc/gshadow命令时报错了,原因是bash支持命令展开,而 ! 是展开的一种修饰前缀,因此bash试图将 :: 进行展开,这里我们将双引号改为单引号即可,因为单引号为强引用,明确告诉bash不需要对字符串中的内容进行展开。
最后一步,复制家目录:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [root@compute demo] # cp -r /etc/skel /home/user5 [root@compute demo] # ll /home/ 总用量 496 drwx - - - - - - . 3 user3 root 4096 7 月 28 06 : 31 user3 drwx - - - - - - . 3 user4 user4 4096 7 月 28 00 : 29 user4 drwxr - xr - x. 3 root root 4096 7 月 30 01 : 48 user5 [root@compute demo] # chown -R user5:user5 /home/user5 [root@compute demo] # chmod -R --reference=/home/user4 /home/user5 [root@compute demo] # ll /home/ 总用量 496 drwx - - - - - - . 3 user3 root 4096 7 月 28 06 : 31 user3 drwx - - - - - - . 3 user4 user4 4096 7 月 28 00 : 29 user4 drwx - - - - - - . 3 user5 user5 4096 7 月 30 01 : 48 user5 |
到此为止,user5用户就添加完成了,现在可以用user5用户登入了,密码就是刚才设置的password
1 2 3 4 5 6 7 8 | [root@compute demo] # su -l user5 上一次登录:日 7 月 30 01 : 53 : 57 CST 2017pts / 1 上 [user5@compute ~]$ touch hello.c [user5@compute ~]$ ll 总用量 0 - rw - rw - r - - . 1 user5 user5 0 7 月 30 01 : 54 hello.c [user5@compute ~]$ pwd / home / user5 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?