人生不如戏 阅读(16) 评论(0)

添加用户

useradd或者adduser。其实adduser是useradd的一个软连接。以useradd为例,其用法为 useradd  [option]  USERNAME

[root@compute ~]# ll `which adduser`
lrwxrwxrwx. 1 root root 7 5月  26 14:21 /usr/sbin/adduser -> useradd

-u  指定新添加用户的UID,不过根据规定,普通用户的UID必须大于499且不能和已存在的UID重复。

[root@compute ~]# useradd -u 1010 user1
[root@compute ~]# tail -1 /etc/passwd
user1:x:1010:1010::/home/user1:/bin/bash

-g 指定新添加用户的基本组,可以使用GID也可以使用组名来为其指明基本组(可以用id命令来查看用户信息)

[root@compute ~]# useradd -g root user2
[root@compute ~]# id user2
uid=1011(user2) gid=0(root) 组=0(root)

-G 指定新添加的用户的附加组,附加组可以有多个,多个附加组之间用逗号隔开。

[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可以禁止某账户登入)

[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号

[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命令也可以查看用户相关信息

[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 同时删除用户的家目录。

[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。具体实例如下:

[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 参数用于修改用户名

[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 参数来指明从标准输入来获取密码。

[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文件

[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命令。

 

手动创建用户

这部分需要了解linux保存用户的几个配置文件。

/etc/passwd —— 账号文件

/etc/shadow —— 密码文件

/etc/group—— 组信息文件

/etc/gshadow —— 组密码文件

/etc/skel —— 用户默认家目录的备份文件

 

[root@compute demo]# tail -1 /etc/passwd
user3:x:505:0::/home/user3:/bin/tcsh

passwd文件中的配置规则如下:

用户名:密码占位符:用户ID:组ID:一般的信息:家目录:默认登入shell

[root@compute demo]# tail -1 /etc/passwd
user3:x:505:0::/home/user3:/bin/tcsh

shadow文件的配置规则如下:

账号

加密的密码,注意前三个字符 &6& 代表着密码的加密方式,后面会用到。

最后一次修改密码的日期,该位是从1970年1月1号开始到上次密码修改的天数,0表示用户下一次登入需要改密码,空白表示密码年龄功能被禁用。

密码最小年龄,0或空白表示没有最小年龄。

密码最大年龄,空白表示没有密码最大年龄。超过密码最大年龄还未改密码将进入密码警告时间段。

密码警告时间段,该阶段会提示用户修改密码,0或空白表示没有密码警告时间段,超过密码警告时间段将密码禁用期。

密码禁用期,该阶段会强制用户修改密码,不修改就无法登入。空白表示没有禁用期,超过将进入账户过期期。

账户过期期,账户过期后该账户将无法登入,该位与上面的密码禁用期有所不同,密码禁用期超过后用户只要修改密码后就可以重新登入,而账户过期永远无法登入,除非管理员解封。

保留位,该字段保留未用。

group文件的配置规则如下:

[root@compute demo]# tail -1 /etc/group
user4:x:1013:

组名:密码占位符:组ID:以该组为额外组的组内用户

有上面这些基本知识后现在正式开始手动添加用户

首先添加账户:

[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写了一个加密程序。

#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;
}

编译命令:

[root@compute demo]# gcc encrypt.c -o encrypt -lcrypt

注:上面的encrypt.c为源文件,encrypt为输出程序,-lcrypt为用到的加密库。

现在可以用这个程序来生成密码了。

[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/ 。

[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中加入其基本组

[root@compute demo]# echo "user5:x:5000:" >> /etc/group
[root@compute demo]# tail -1 /etc/group
user5:x:5000:

最后在gshadow中添加组信息(为了方便起见,我们暂时不添加组密码,有兴趣的同学可以自己添加,添加方式和添加用户密码相同,把加密后的密码替换!即可):

[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不需要对字符串中的内容进行展开。

最后一步,复制家目录:

[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

[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