# /etc/passwd、/etc/shadow 上課講義
## `/etc/passwd`
- 
- 不用 sudo 就可以查看
- 每行代表一個帳號
- 有些帳號是為了系統正常運作而存在的,不可以亂刪
- 例如:nobody
- 欄位架構
- 使用者名稱
- 密碼
- 使用者 id (uid)
- 在 Linux 中,是透過 uid 來辨別使用者
- 使用者名稱只是參考用的 XD
- 使用者所在的群組 id (gid)
- `cat /etc/group` 可以查看結果是不是對得起來
- 使用者的資訊
- 在 `adduser` 指令中輸入的資訊都會存在這個欄位
- 用 `,` 隔開
- 
- 登入後的起始目錄 (家目錄)
- 登入後 shell 的路徑
- 
## `/etc/shadow`
- 
- 要用 sudo 才可以查看
- 欄位架構
- 使用者名稱
- 加密後的密碼
- 上一次密碼變更的天數
- 從 1970 年 1 月 1 日算起的天數
- [Unix Time](https://en.wikipedia.org/wiki/Unix_time)
- 密碼最短使用期限
- 兩次變更密碼最短需要間隔多久,單位為天
- 如果此欄位為 0 則表示隨時可更改密碼
- 密碼最長使用期限
- 密碼最多可以使用多久,單位為天
- 如果此欄位是空的則代表關閉此功能
:::info
**如果 `密碼最短使用期限` 大於 `密碼最長使用期限`**
- 使用者就不能改密碼
- 例如
- `密碼最短使用期限` 設定 100 天
- `密碼最長使用期限` 設定 10 天
- 密碼 `123` 最長可以使用 10 天,但我需要等 100 天才可以改密碼
:::
- 密碼過期前發出警告的期限
- 密碼過期前多久,系統會對使用者發出警告,單位為天
- 如果此欄位是 0 則代表關閉此功能
- 密碼過期後的放寬天數
- 當密碼過期後,使用者還有多久的時間可以登入更改密碼,單位為天
- 如果此欄位是空的則代表關閉此功能
- 帳號過期時間
- 此帳號過期的時間點
- 從 1970 年 1 月 1 日算起的天數
- 如果此欄位是空的則代表關閉此功能
## 密碼的欄位
- `x`:`/etc/passwd` 中的密碼都顯示為 `x`
- 對應到存在 `/etc/shadow` 的密碼
- `!`:此帳號被鎖定,不能用密碼登入
- 用於使用者
- `*`:此帳號被鎖定,不能用密碼登入
- 用於服務
- ` `:沒有密碼
- 如果此時 `passwd` 會直接進入設定密碼的環節
- 有些讀取 `/etc/shadow` 的檔案,可能會因為此欄位是空的,就不提供服務
---
## 實作
:::danger
**注意事項**
要清楚自己下什麼指令,並做好改壞要重裝的決心
:::
- 玩之前先建立一個 user
- `sudo adduser <使用者名稱>`
- `cat /etc/passwd`
- `sudo cat /etc/shadow`
### `/etc/shadow`
- 密碼欄位
- 刪掉一個字
- 變成 `*`、`!`
- 變成 ` `
### `/etc/passwd`
- 密碼欄位
- 變成 `*`、`!`
- 變成 ` `
- uid
- 變成 ` `
- 變成別人的 id
- 可以到其他使用者的家目錄底下 `touch` 檔案
- `ls -al` 查看 owner
- 起始目錄
- 改成不存在的路徑
- 改成 `/etc`
- `pwd` 查看當前路徑
- shell 路徑
- 改成不存在的路徑
- 改成 `/bin/false`
- 使用者無法登入
- 不會提供任何提示,然後狠狠地把你甩到一邊去
- 改成 `/usr/sbin/nologin`
- 使用者無法登入
- 會給你提示,`This account is currently not available.`
- 然後狠狠地把你甩到一邊去
- 改成 `/usr/game/sl`
- `sudo apt install sl`