認識/etc/passwd和/etc/shadow
這兩個文件能夠說是linux系統中最重要的文件之一。若是沒有這兩個文件或者這兩個文件出問題,則你是沒法正常登陸linux系統的。php
[root@localhost ~]# cat /etc/passwd | head root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin [root@localhost ~]#
/etc/passwd由「:」分割成7個字段,每一個字段的具體含義是:mysql
1)用戶名(如第一行中的root就是用戶名),表明用戶帳號的字符串。用戶名字符能夠是大小寫字母、數字、減號(不能出如今首位)、點以及下劃線,其餘字符不合法。雖然用戶名中能夠出現點,但不建議使用,尤爲是首位爲點時,另外減號也不建議使用,由於容易形成混淆。linux
2)存放的就是該帳號的口令,爲何是‘x’呢?早期的linux系統口令確實是存放在這裏,但基於安全因素,後來就將其存放到/etc/shadow中了,在這裏只用一個‘x’代替。sql
3)這個數字表明戶標識號,也叫作uid。系統識別用戶身份就是經過這個數字來的,0就是root,也就是說你能夠修改test用戶的uid爲0,那麼系統會認爲root和test爲同一帳戶。shell
4)表示組標識號,也叫作gid。這個字段對應着/etc/group中的一條記錄,其實/etc/group和/etc/passwd基本上相似。安全
5)註釋說明,該字段沒有實際意義,一般記錄該用戶的一些屬性,例如姓名、電話、地址等等。不過,當你使用finger的功能時會顯示這些信息的。bash
6)用戶的家目錄,當用戶登陸時就處在這個目錄下。root的家目錄是/root,普通用戶的家目錄爲/home/username,這個字段是能夠自定義的,好比你創建一個普通用戶test1,要想讓test1的家目錄在/data目錄下,只要修改/etc/passwd文件中test1那行中的該字段爲/data便可。ssh
7)shell,用戶登陸後要啓動一個進程,用來將用戶下達的指令給內核,這就是shell。linux的shell有不少種sh、csh、ksh、tcsh和bash等。查看/etc/passwd文件,該字段中除了/bin/bash外還有/sbin/nologin比較多,它表示不容許該帳號登陸。若是你想創建一個帳號不讓他登陸,那麼就能夠把該字段該成/sbin/nologin,默認是/bin/bash。post
[root@localhost ~]# cat /etc/shadow root:$6$YeN8c9qp$kF/ccExwxWD56sKqq0fDZDGO5D4.OLivV2v3L.2wvG8uDlb9sK2zQtw9gij37AOeAE/8gdAObi8sU0A7YE.tC0:17753:0:99999:7::: bin:*:17632:0:99999:7::: daemon:*:17632:0:99999:7::: adm:*:17632:0:99999:7::: lp:*:17632:0:99999:7::: sync:*:17632:0:99999:7::: shutdown:*:17632:0:99999:7::: halt:*:17632:0:99999:7::: mail:*:17632:0:99999:7::: operator:*:17632:0:99999:7::: games:*:17632:0:99999:7::: ftp:*:17632:0:99999:7::: nobody:*:17632:0:99999:7::: systemd-network:!!:17743:::::: dbus:!!:17743:::::: polkitd:!!:17743:::::: sshd:!!:17743:::::: postfix:!!:17743:::::: mysql:!!:17745:0:99999:7::: www:!!:17746:0:99999:7:::
再來看看/etc/shadow這個文件,和/etc/passwd相似,用「:」分割成9個字段。ui
1)用戶名,跟/etc/passwd對應
2)用戶密碼,這個纔是該帳號的真正的密碼,不過這個密碼已經加密過了,可是有些黑客仍是可以解密的。因此爲了安全,這個文件屬性設置爲600,只容許root讀寫。
3)上次更改面的日期,這個數字是這樣計算得來的,距離1970年1月1日到上次更改密碼的日期,例如上次更改密碼的日期是2012年1月1日,則這個值就是365*(2012-1970)+1=15331。
4)要過多少天才能夠更改密碼,默認是0,即不限制。
5)密碼多少天后到期。即在多少天內必須更改密碼,例如這裏設置成30,則30天內必須更改一次密碼,不然將不能登陸,默認是99999,能夠理解爲永遠不須要改。
6)密碼到期前的警告期限,若這個值成7,則表示當7天后密碼過時時,系統就發出警告告訴用戶,提醒用戶的密碼將在7天后到期。
7)帳號失效期限。你能夠這樣理解,若是設置這個值爲3,則表示:密碼已經到期,然而用戶並無在到期前修改密碼,那麼再過3天,則這個帳號就失效了,即鎖定了。
8)帳號的生命週期。跟第三段同樣,是按距離1970年1月1日多少天算的。它表示的含義是,帳號在這個日期前可使用,到期後帳號做廢。
9)做爲保留用的,沒有什麼意義。
新增、刪除用戶和用戶組
一、新增一個組 groupadd [-g GID] groupname
[root@localhost ~]# groupadd grptest1 [root@localhost ~]# tail -n 5 /etc/group postfix:x:89: mysql:x:1000: www:x:1001: zhouguowei:x:1002: grptest1:x:1003: [root@localhost ~]#
不加-g則按照系統默認的gid建立組。
[root@localhost ~]# groupadd -g 1004 grptest2 [root@localhost ~]# tail -n 5 /etc/group mysql:x:1000: www:x:1001: zhouguowei:x:1002: grptest1:x:1003: grptest2:x:1004: [root@localhost ~]#
-g選項能夠自定義gid
二、刪除組 groupdel groupname
[root@localhost ~]# groupdel grptest1 [root@localhost ~]# groupdel grptest2 [root@localhost ~]# tail -n 5 /etc/group postdrop:x:90: postfix:x:89: mysql:x:1000: www:x:1001: zhouguowei:x:1002: [root@localhost ~]#
三、增長用戶 useradd [-u UID] [-g GID] [-d HOME] [-M] [-s]
-u自定義UID
-g使其屬於已經存在的某個GID
-d自定義用戶的家目錄
-M不創建家目錄
-s自定義shell
[root@localhost ~]# useradd test10 [root@localhost ~]# tail -n 5 /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin mysql:x:1000:1000::/home/mysql:/bin/bash www:x:1001:1001::/home/www:/bin/bash zhouguowei:x:1002:1002::/home/zhouguowei:/bin/bash test10:x:1003:1003::/home/test10:/bin/bash
[root@localhost ~]# useradd -u 1004 -g 1004 -M -s /sbin/nologin test11 [root@localhost ~]# tail -n 5 /etc/passwd mysql:x:1000:1000::/home/mysql:/bin/bash www:x:1001:1001::/home/www:/bin/bash zhouguowei:x:1002:1002::/home/zhouguowei:/bin/bash test10:x:1003:1003::/home/test10:/bin/bash test11:x:1004:1004::/home/test11:/sbin/nologin
[root@localhost ~]# cd /home [root@localhost home]# ls mysql test10 www zhouguowei [root@localhost home]#
你會發現,建立test11時,加上了-M選項後,在/etc/passwd文件中test11那行的第六字段依然有/home/test11.但是ls查看該目錄是,會提示該目錄不存在。
四、刪除用戶userdel [-r] username
[root@localhost home]# userdel test11 [root@localhost home]# userdel -r test10 [root@localhost home]# ls /home/test10 ls: cannot access /home/test10: No such file or directory [root@localhost home]#
-r選項的做用是刪除用戶時,連同用戶的加目錄一塊兒刪除。
chfn更改用戶finger
前面內容中提到了finger,即在/etc/passwd文件中的第5個字段中所顯示的信息,那麼如何去設定這個信息呢?
[root@localhost home]# chfn test Changing finger information for test. Name []: test Office []: test'office Office Phone []: 123456789 Home Phone []: 123654789 Finger information changed. [root@localhost home]# tail -n 5 /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin mysql:x:1000:1000::/home/mysql:/bin/bash www:x:1001:1001::/home/www:/bin/bash zhouguowei:x:1002:1002::/home/zhouguowei:/bin/bash test:x:1003:1003:test,test'office,123456789,123654789:/home/test:/bin/bash [root@localhost home]#
就是chfn這個命令。修改完後,就會在/etc/passwd文件中的那一行第5個字段中看到相關信息了,默認是空的。
建立、修改一個用戶的密碼 passwd [username]
等建立完帳戶後,默認是沒有設置密碼的,雖然沒有密碼,但該帳戶一樣登陸不了系統。只有設置好密碼後方可登陸系統。
[root@localhost home]# passwd Changing password for user root. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully.
[root@localhost home]# passwd test Changing password for user test. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [root@localhost home]#
passwd後面不跟用戶名則是更改當前用戶的密碼,當前用戶爲root,因此此時修改的是root的密碼,後面跟test,則修改的是test的密碼。
用戶身份切換
在linux系統中,有時候普通用戶有些事情是不能作的,除非是root用戶才能作到。這是就須要切換到root身份來作事了。
用test帳號登陸linux系統,而後使用su -就能夠切換成root身份,前提是知道root的密碼。
Last login: Wed Sep 5 22:22:05 2018 [test@localhost ~]$ su - Password: Last login: Wed Sep 5 22:23:20 CST 2018 on pts/0 [root@localhost ~]#
你可使用echo $LOGNAME來查看當前登陸的用戶名
[root@localhost ~]# echo $LOGNAME root [root@localhost ~]# su - test Last login: Wed Sep 5 22:24:37 CST 2018 from 10.0.30.1 on pts/0 [test@localhost ~]$ echo $LOGNAME test [test@localhost ~]$
su的語法爲:su [-] username
後面能夠跟「-」也能夠不跟,普通用戶su不加username時就是切換到root用戶,當前root用戶一樣能夠su到普通用戶。
加「-」後會連同用戶的環境變量一塊兒切換過來。su test後雖然切換到了test用戶,可是當前目錄仍是切換前的/root目錄,而後當用su - test時切換用戶後則到了test的家目錄/home/test。當用root切換普通用戶時,是不須要輸入密碼的。這也體現了root用戶至高無上的權利。
用su是能夠切換用戶身份,若是每一個普通用戶都能切換到root身份,若是某個用戶不當心泄露了root的密碼,那豈不是系統很是的不安全?沒有錯,爲了改進這個問題,產生了sudo這個命令。使用sudo執行一個root才能執行的命令是能夠辦到的,可是須要輸入密碼,這個密碼並非root的密碼而是用戶本身的密碼,默認只有root用戶能使用sudo命令,普通用戶想要使用sudo,則須要root預先設定的,即,使用visudo命令去相關的配置文件/etc/sudoers,若是沒有visudo這個命令,請先會用yum install -y sudo安裝。
root ALL=(ALL) ALL test ALL=(ALL) ALL
默認root可以sudo是由於這個文件中有一行「root ALL=(ALL) ALL」,在該行下面加入「test ALL=(ALL) ALL」,就可讓test用戶擁有sudo的權利。若是沒增長一個用戶就設置一行,這樣太麻煩了,因此你能夠這樣設置。
## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
把這一行前面的「#」去掉,這一行生效。它的意思是,wheel這個組下面的全部用戶擁有了sudo的權限。
[root@localhost ~]# su test [test@localhost root]$ touch 1.txt touch: cannot touch 鈥.txt鈥 Permission denied [test@localhost root]$ sudo touch 1.txt We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for test: [test@localhost root]$ ls -l 1.txt ls: cannot access 1.txt: Permission denied [test@localhost root]$ sudo ls -l 1.txt -rw-r--r--. 1 root root 0 Sep 5 22:51 1.txt [test@localhost root]$