为学生批量创建用户并初始化密码。
1. 创建组
这里有两个班级,创建两个组,便于日后管理。使用命令groupadd
创建两个组,用选项-g
指定组id。
sudo addgroup -gid 201112 class12
sudo addgroup -gid 201314 class34
新的组信息会添加到/etc/group
和/etc/gshadow
文件中。
ubuntu@ubuntu ~:$ tail -2 /etc/group
class12:x:201112:
class34:x:201314:
ubuntu@ubuntu ~:$ sudo tail -2 /etc/gshadow
class12:!::
class34:!::
2. 批量创建用户
2.1 准备批量用户的信息
(1)记录格式
使用命令newusers
批量创建用户。先准备一个批量用户的文件,每一条记录按/etc/passwd
密码文件填写(密码项为空,用x
表示,也可以留空白):
# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 各项含义如下
Username:Password:User ID:Group ID:User Info:Home Directory:Default Shell
(2)准备用户信息
Username
用户名为学生的学号,因Linux用户名不能以数字开头,给学号加上前缀u
。,User Info
用户信息格式为班级-学号-姓名
。准备好学生名单,写一个Python脚本,每个学生生成一条上述格式的记录,并保存在txt文件users-info.txt
。
打开/etc/passwd
文件查看User ID使用情况,我在的例子中,用户ID最大值为1001。那么给学生创建用户,从2001开始。
$ tail -1 /etc/passwd
lighthouse:x:1001:1001::/home/lighthouse:/bin/bash
打开/etc/group
文件查看刚才创建组的ID,
ubuntu@ubuntu ~:$ tail -2 /etc/group
class12:x:201112:
class34:x:201314:
(3)准备用户密码
准备批量用户的初始密码文件,每一条记录的格式为
username:password
学生初始密码设为学号,写一个脚本,将批量用户的初始密码信息保存在users-passwd.txt
。
(4)将文件上传到服务器
如果批量用户信息和初始密码文件是在本地生成,需要上传到服务器,使用命令scp
,
$ scp users-info.txt ubuntu@os.suqiankun.com:~/
ubuntu@os.suqiankun.com's password:
users-info.txt 100% 11KB 324.7KB/s 00:00
$ scp users-passwd.txt ubuntu@os.suqiankun.com:~/
ubuntu@os.suqiankun.com's password:
users-passwd.txt 100% 3386 92.1KB/s 00:00
2.2 批量添加用户
(1)批量添加用户
SSH远程登录服务器,使用命令newusers
批量创建用户名。
sudo newusers < users-info.txt
打开文件/etc/passwd
检查用户名是否创建。
(2)批量设置初始密码
使用命令chpasswd
批量设置用户的初始密码。
sudo chpasswd < users-passwd.txt
注:新版本Ubuntu不需要先关闭,设置密码,再关闭影子密码。直接运行命令chpasswd
进行设置。
使用命令sudo pwunconv
,关闭用户影子密码(shadow password)。其他相关命令如下:
- The
pwunconv
command creates passwd from passwd and shadow and then removes shadow. - The
pwconv
command creates shadow from passwd and an optionally existing shadow. - The
grpunconv
command creates group from group and gshadow and then removes gshadow. - The
grpconv
command creates gshadow from group and an optionally existing gshadow.
运行命令sudo pwconv
开启用户的影子密码。
(3)遇到问题及解决
批量创建好用户名和初始化密码后,拿一个用户名测试登录,一直提示密码错误。
$ ssh u201821121027@os.suqiankun.com
u201821121027@os.suqiankun.com's password:
Permission denied, please try again.
查看日志文件/var/log/auth.log
,提示用户无效。
Failed password for invalid user u201821121027 from 43.138.137.190 port 42670 ssh2
打开/etc/passwd
文件,发现新创建的用户末尾多了一个^M
,如下:
lighthouse:x:1001:1001::/home/lighthouse:/bin/bash
u201821121027:x:2001:201112:*-201821121027-*:/home/u201821121027:/bin/bash^M
原因是users-info.txt
是在Windows生成,Windows用CRLF,即\r\n
,表示行结束。而在Unix,行结束符(end-of-line)是\n
。
解决方法:将passwd
格式转适合Unix的格式,具体步骤如下
- 用命令
sudo vim /etc/passwd
打开文件passwd
:e ++ff=dos
,将passwd
文件转为dos文件格式:set ff=unix
,将passwd
文件转为unix文件格式
还有一种解决方法,在生成文件users-info.txt
和users-passwd.txt
时,就生成Unix格式,在open
函数传入参数newline='\n'
。
with open(filename, 'w', newline='\n') as f:
3. 其他操作
学生可能会忘记密码,在课程进行过程中,可能需要添加新的学生。
(1)新增用户
上述给的是批量创建用户,如果只是添加一个,使用命令adduser
,举例如下:
# 创建用户,指定组id
$ sudo adduser --gid 201314 wangfeng
Adding user `wangfeng' ...
Adding new user `wangfeng' (1002) with group `class34' ...
Creating home directory `/home/wangfeng' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for wangfeng
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
(2)删除用户和组
使用命令deluser
删除用户,
$ sudo deluser wangfeng
Removing user `wangfeng' ...
Warning: group `wangfeng' has no more members.
Done.
(3)用户登录后修改密码
学生登录后,使用命令passwd
修改密码:
$ passwd
Changing password for user suqiankun.
Changing password for suqiankun.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
学生如果忘记密码,用命令sudo passwd username
重置密码。
$ sudo passwd lighthouse
New password:
Retype new password:
(4)用户查看自己组信息
用命令id
查看指定用户或者当前用户(如果没有指定用户)的用户和组信息。
$ id u201821121027
uid=2001(u201821121027) gid=201112(class12) groups=201112(class12)
ubuntu@VM-8-13-ubuntu:~$ id root
uid=0(root) gid=0(root) groups=0(root)
ubuntu@VM-8-13-ubuntu:~$ id ubuntu
uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd)
(5)为用户添加sudo,root权限
为用户添加sudo权限,将用户添加到sudo组里,命令如下:
$ sudo usermod -aG sudo wangfeng
ubuntu@VM-8-13-ubuntu:/home$ id wangfeng
uid=1002(wangfeng) gid=201314(class34) groups=201314(class34),27(sudo)
$ usermod -aG wheel suqiankun # In CentOS, Members of the wheel group are automatically granted sudo privileges.
注:下面这个是不是不需要???
为用户添加root权限,方法多种。这里使用命令usermod
,举例如下:
$ usermod -G root suqiankun
$ id suqiankun
uid=19000(suqiankun) gid=191112(class12) groups=191112(class12),0(root)
更加精细的权限控制,直接修改文件/etc/sudoers
中的内容。
(6)改变用户的组
使用命令usermod
,举例如下:
$ usermod -g new_group user_name
# 举例如下:
$ id chenyao
uid=19006(chenyao) gid=191314(class34) groups=191314(class34)
$ usermod -g class12 chenyao
$ id chenyao
uid=19006(chenyao) gid=191112(class12) groups=191112(class12)