添加用戶
useradd或者adduser。其實adduser是useradd的一個軟連接。以useradd為例,其用法為 useradd [option] USERNAME
1 [root@compute ~]# ll `which adduser` 2 lrwxrwxrwx. 1 root root 7 5月 26 14:21 /usr/sbin/adduser -> useradd
-u 指定新添加用戶的UID,不過根據規定,普通用戶的UID必須大於499且不能和已存在的UID重復。
1 [root@compute ~]# useradd -u 1010 user1 2 [root@compute ~]# tail -1 /etc/passwd 3 user1:x:1010:1010::/home/user1:/bin/bash
-g 指定新添加用戶的基本組,可以使用GID也可以使用組名來為其指明基本組(可以用id命令來查看用戶信息)
1 [root@compute ~]# useradd -g root user2 2 [root@compute ~]# id user2 3 uid=1011(user2) gid=0(root) 組=0(root)
-G 指定新添加的用戶的附加組,附加組可以有多個,多個附加組之間用逗號隔開。
1 [root@compute ~]# useradd -G user1,root user3 2 [root@compute ~]# id user3 3 uid=1012(user3) gid=1012(user3) 組=1012(user3),0(root),1010(user1)
-d 為新添加的用戶指定家目錄,默認情況下家目錄是/home下的與用戶名同名的目錄。
-M 不為新用戶創建家目錄。
-s 為新添加的用戶指定默認的shell。(系統中有一個nologin的shell可以禁止某賬戶登入)
1 [root@compute ~]# useradd -s /sbin/nologin user4 2 [root@compute ~]# su user4 3 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 [root@compute ~]# id -u user1 2 1010 3 [root@compute ~]# id -un user1 4 user1 5 [root@compute ~]# id -G user3 6 1012 0 1010 7 [root@compute ~]# id -Gn user3 8 user3 root user1
finger命令也可以查看用戶相關信息
1 [root@compute ~]# finger user1 2 Login: user1 Name: 3 Directory: /home/user1 Shell: /bin/bash 4 Never logged in. 5 No mail. 6 No Plan.
刪除用戶
使用userdel命令來刪除用戶,不過值得注意的是userdel命令默認情況下是不會刪除用戶的家目錄。
userdel的用法:userdel [option] USERNAME
-r 同時刪除用戶的家目錄。
1 [root@compute ~]# ls /home 2 boost compute EasyDrcom libpcap lost+found user1 user2 user3 user4 3 [root@compute ~]# userdel user1 4 userdel:組“user1”沒有移除,因為它包含其它成員。 5 [root@compute ~]# userdel -r user2 6 [root@compute ~]# ls /home 7 boost compute EasyDrcom libpcap lost+found user1 user3 user4
修該用戶信息
使用usermod來修改用戶的賬戶信息,其用法同useradd。具體實例如下:
1 [root@compute ~]# id user3 2 uid=1012(user3) gid=1012(user3) 組=1012(user3),0(root),1010(user1) 3 [root@compute ~]# usermod -u 505 user3 4 [root@compute ~]# id user3 5 uid=505(user3) gid=1012(user3) 組=1012(user3),0(root),1010(user1) 6 [root@compute ~]# finger user3 7 Login: user3 Name: 8 Directory: /home/user3 Shell: /bin/bash 9 Never logged in. 10 No mail. 11 No Plan. 12 [root@compute ~]# usermod -g 0 -s /bin/tcsh user3 #這里該的基本組必須事先存在 13 [root@compute ~]# !id 14 id user3 15 uid=505(user3) gid=0(root) 組=0(root),1010(user1) 16 [root@compute ~]# !fing 17 finger user3 18 Login: user3 Name: 19 Directory: /home/user3 Shell: /bin/tcsh 20 Never logged in. 21 No mail. 22 No Plan.
-l 參數用於修改用戶名
1 [root@compute ~]# usermod -l u3 user3 2 [root@compute ~]# id u3 3 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 [root@compute ~]# passwd user3 2 更改用戶 user3 的密碼 。 3 新的 密碼: 4 無效的密碼: 密碼未通過字典檢查 - 過於簡單化/系統化 5 重新輸入新的 密碼: 6 passwd:所有的身份驗證令牌已經成功更新。 7 [root@compute ~]# echo "123456789" | passwd user3 --stdin 8 更改用戶 user3 的密碼 。 9 passwd:所有的身份驗證令牌已經成功更新。
-d 參數可以刪除用戶的密碼。
組的創建
組的創建使用groupadd命令,可以使用 -g 指定GID,-r表明改組為系統組。具體用法和useradd類似,以下關於組的操作命令的用法均可參考關於用戶操作的命令的用法。
組信息修改
groupmod 命令用於修改組信息,-g 修改GID,-n 修改組名。
組的刪除
groupdel 命令用於刪除一個組
組添加密碼
使用 gpasswd 命令用於修改組密碼。組密碼主要用於臨時改變用戶所屬的組。
比如下面的代碼中,user3用戶臨時使用了user4組創建了一個b.txt文件
1 [root@compute ~]# usermod -l user3 u3 2 [root@compute ~]# gpasswd user4 3 正在修改 user4 組的密碼 4 新密碼: 5 請重新輸入新密碼: 6 [root@compute ~]# su - user3 7 上一次登錄:五 7月 28 06:29:18 CST 2017pts/1 上 8 [user3@compute ~]$ touch a.txt 9 [user3@compute ~]$ id 10 uid=505(user3) gid=0(root) 組=0(root),1010(user1) 環境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 11 [user3@compute ~]$ ll 12 總用量 0 13 -rw-r--r--. 1 user3 root 0 7月 28 06:30 a.txt 14 [user3@compute ~]$ newgrp user4 15 密碼: 16 [user3@compute ~]$ touch b.txt 17 [user3@compute ~]$ id 18 uid=505(user3) gid=1013(user4) 組=1013(user4),0(root),1010(user1) 環境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 19 [user3@compute ~]$ ll 20 總用量 0 21 -rw-r--r--. 1 user3 root 0 7月 28 06:30 a.txt 22 -rw-r--r--. 1 user3 user4 0 7月 28 06:31 b.txt 23 [user3@compute ~]$ exit 24 exit 25 [user3@compute ~]$ id 26 uid=505(user3) gid=0(root) 組=0(root),1010(user1) 環境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 27 [user3@compute ~]$ exit 28 logout 29 [root@compute ~]#
注:上面的newgrp用於臨時切換基本組,當這個臨時組用完要退出時使用exit命令。
手動創建用戶
這部分需要了解linux保存用戶的幾個配置文件。
/etc/passwd —— 賬號文件
/etc/shadow —— 密碼文件
/etc/group—— 組信息文件
/etc/gshadow —— 組密碼文件
/etc/skel —— 用戶默認家目錄的備份文件
1 [root@compute demo]# tail -1 /etc/passwd 2 user3:x:505:0::/home/user3:/bin/tcsh
passwd文件中的配置規則如下:
用戶名:密碼占位符:用戶ID:組ID:一般的信息:家目錄:默認登入shell
1 [root@compute demo]# tail -1 /etc/shadow 2 user3:$6$W58G6w9w$W7qYMrf5U9TF3yAfdqZhlluiiCgfd5eyDGaRbs0j5eVCGgisA8aEYGvmitpAraHC1MppdmiD9jGLgHWADQ3nK0:17374:0:99999:7:::
shadow文件的配置規則如下:
賬號
加密的密碼,注意前三個字符 &6& 代表着密碼的加密方式,后面會用到。
最后一次修改密碼的日期,該位是從1970年1月1號開始到上次密碼修改的天數,0表示用戶下一次登入需要改密碼,空白表示密碼年齡功能被禁用。
密碼最小年齡,0或空白表示沒有最小年齡。
密碼最大年齡,空白表示沒有密碼最大年齡。超過密碼最大年齡還未改密碼將進入密碼警告時間段。
密碼警告時間段,該階段會提示用戶修改密碼,0或空白表示沒有密碼警告時間段,超過密碼警告時間段將密碼禁用期。
密碼禁用期,該階段會強制用戶修改密碼,不修改就無法登入。空白表示沒有禁用期,超過將進入賬戶過期期。
賬戶過期期,賬戶過期后該賬戶將無法登入,該位與上面的密碼禁用期有所不同,密碼禁用期超過后用戶只要修改密碼后就可以重新登入,而賬戶過期永遠無法登入,除非管理員解封。
保留位,該字段保留未用。
group文件的配置規則如下:
[root@compute demo]# tail -1 /etc/group user4:x:1013:
組名:密碼占位符:組ID:以該組為額外組的組內用戶
有上面這些基本知識后現在正式開始手動添加用戶
首先添加賬戶:
1 [root@compute demo]# echo "user5:x:5000:5000::/home/user5:/bin/bash" >> /etc/passwd 2 [root@compute demo]# tail -1 !$ 3 tail -1 /etc/passwd 4 user5:x:5000:5000::/home/user5:/bin/bash
添加賬戶密碼(不同的Linux發行版系統使用的密碼加密方式不同,加密方式的查看方式見上面紅色字體,在我的電腦上為6號加密方式即SHA-512加密):
目前我還沒找到能加密sha512(帶salt)的加密工具,於是自己用c寫了一個加密程序。
1 #define _XOPEN_SOURCE 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <string.h> 5 int main() 6 { 7 char salt[20]={0}; 8 char key[100]={0}; 9 char tmp[20]; 10 int id; 11 int length=0; 12 printf("please choose the encrypt algorithm:\n"); 13 printf("1 : MD5\n" 14 "5 : SHA-256\n" 15 "6 : SHA-512\n"); 16 scanf("%d",&id); 17 salt[0]='$'; 18 salt[2]='$'; 19 salt[1]=id+'0'; 20 21 printf("please input salt(no more than 8 characters):"); 22 scanf("%s",tmp); 23 length=strlen(tmp); 24 strcpy(salt+3, tmp); 25 salt[3+length]='$'; 26 27 printf("please input the key:"); 28 scanf("%s",key); 29 30 printf("%s\n",crypt(key, salt)); 31 return 0; 32 }
編譯命令:
[root@compute demo]# gcc encrypt.c -o encrypt -lcrypt
注:上面的encrypt.c為源文件,encrypt為輸出程序,-lcrypt為用到的加密庫。
現在可以用這個程序來生成密碼了。
[root@compute demo]# ./encrypt please choose the encrypt algorithm: 1 : MD5 5 : SHA-256 6 : SHA-512 6 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 [root@compute demo]# echo 'user5:$6$1234abcd$RQ0et4pXYf990f./lJNcInZtANef5Mw0GSA0ftwDYKZEViukdnf9bM/PALLnGuSv91L/9bWBkFBQM4Os8CMYk/:17374:0:99999:7:::' >> /etc/shadow 2 [root@compute demo]# tail -1 !$ 3 tail -1 /etc/shadow 4 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中添加組信息(為了方便起見,我們暫時不添加組密碼,有興趣的同學可以自己添加,添加方式和添加用戶密碼相同,把加密后的密碼替換!即可):
1 [root@compute demo]# echo "user5:!::" >> /etc/gshadow 2 -bash: :: unrecognized history modifier 3 [root@compute demo]# echo 'user5:!::' >> /etc/gshadow 4 [root@compute demo]# tail -1 /etc/gshadow 5 user5:!::
注:上面可以看到我使用echo "user5:!::" >> /etc/gshadow命令時報錯了,原因是bash支持命令展開,而 ! 是展開的一種修飾前綴,因此bash試圖將 :: 進行展開,這里我們將雙引號改為單引號即可,因為單引號為強引用,明確告訴bash不需要對字符串中的內容進行展開。
最后一步,復制家目錄:
1 [root@compute demo]# cp -r /etc/skel /home/user5 2 [root@compute demo]# ll /home/ 3 總用量 496 4 drwx------. 3 user3 root 4096 7月 28 06:31 user3 5 drwx------. 3 user4 user4 4096 7月 28 00:29 user4 6 drwxr-xr-x. 3 root root 4096 7月 30 01:48 user5 7 [root@compute demo]# chown -R user5:user5 /home/user5 8 [root@compute demo]# chmod -R --reference=/home/user4 /home/user5 9 [root@compute demo]# ll /home/ 10 總用量 496 11 drwx------. 3 user3 root 4096 7月 28 06:31 user3 12 drwx------. 3 user4 user4 4096 7月 28 00:29 user4 13 drwx------. 3 user5 user5 4096 7月 30 01:48 user5
到此為止,user5用戶就添加完成了,現在可以用user5用戶登入了,密碼就是剛才設置的password
1 [root@compute demo]# su -l user5 2 上一次登錄:日 7月 30 01:53:57 CST 2017pts/1 上 3 [user5@compute ~]$ touch hello.c 4 [user5@compute ~]$ ll 5 總用量 0 6 -rw-rw-r--. 1 user5 user5 0 7月 30 01:54 hello.c 7 [user5@compute ~]$ pwd 8 /home/user5