---
# System prepended metadata

title: User
tags: [Unix-like]

---

---
tags: Unix-like
---
# User

[TOC]

## 使用者身份切換

### [`su`](https://linux.die.net/man/1/su)

切換使用者，會開啟一個新的 shell 環境。

```shell
$ su - <user>  # Switches to user.
$ sudo su -    # Switches to root.
```

`-` 代表使用 [login-shell](http://linux.vbird.org/linux_basic/0320bash.php#settings_bashrc_shell) 的變數檔案讀取方式來登入系統。

`$` 代表一般使用者，`#` 代表 root。

#### 參考資料

 * [使用者身份切換 - su / 鳥哥的 Linux 私房菜](http://linux.vbird.org/linux_basic/0410accountmanager.php#su)

### [`sudo`](https://linux.die.net/man/8/sudo)

可以用來取得 root 或是其他帳號的權限，不過它在取得 root 或其他帳號權限的時候，是輸入自己的密碼，而不是 root 或其他帳號的密碼。

```shell
$ sudo <command>

-u <user>
-g <group>
```

#### [`/etc/sudoers`](https://linux.die.net/man/5/sudoers)

有被特別設定在 `/etc/sudoers` 的使用者或群組才能使用 `sudo` 指令，在不需要 root 密碼的情況下取得 root 權限。

> 使用 `visudo` 這個指令來編輯，系統會在編輯完成後自動檢查設定檔的語法是否正確，避免錯誤的語法導致 `sudo` 無法使用。

```
帳號名稱    來源主機=(可切換帳號) 可執行的指令
root       ALL = (ALL) ALL

%群組名稱   來源主機=(可切換帳號) 可執行的指令
%admin     ALL = (ALL) ALL

不需要輸入密碼
%admin     ALL=(ALL) NOPASSWD:ALL
```

#### 參考資料

 * [使用者身份切換 - sudo / 鳥哥的 Linux 私房菜](http://linux.vbird.org/linux_basic/0410accountmanager.php#sudo)

## 查詢使用者 

```shell
$ w
23:13  up 158 days,  4:50, 2 users, load averages: 1.85 2.00 1.95
USER     TTY      FROM      LOGIN@  IDLE WHAT
catmao   console  -         10 419  158days -
catmao   s000     -         22:30       - w

$ who [-T/--mesg]
catmao   console  Apr 10 18:20 
catmao   ttys000  Sep 15 22:30 

$ who am i
catmao   ttys000  Sep 15 22:30 

$ last
catmao    ttys000    Sun Sep 15 22:30   still logged in
catmao    ttys000    Thu Sep  5 22:47 - 22:47  (00:00)
...

$ id
uid=501(catmao) gid=20(staff) groups=20(staff), ...
```

### 參考資料

 * [who / Linux man page](https://linux.die.net/man/1/who)

## UID

| UID     | Description |
|---------|-------------|
| 0       | 系統管理員 root |
| 1-200   | 由 distributions 自行建立的系統帳號，如 bin、daemon、adm、nobody... |
| 201-999 | 使用者有系統帳號需求時可以使用的帳號 |
| 1000-   | 一般可登入帳號 |

![](https://i.imgur.com/NnovUi9.png)

### [`/etc/group`](https://linux.die.net/man/5/group)

```
group name : password : GID : user list
staff      : *        : 20  : root
```

每個使用者都可以擁有多個支援的群組，在 `/etc/passwd` 裡面的 GID 代表**初始群組 initial group**，`$ groups` 第一個出現的代表**有效群組 effective group**。

[`newgrp`](https://linux.die.net/man/1/newgrp) 以另一個 shell 登入，變更目前使用者的有效群組：

```shell
$ newgrp [group]
```

### [`/etc/passwd`](https://linux.die.net/man/5/passwd)

```
name : password : UID : GID : GECOS                : directory : shell
root : *        : 0   : 0   : System Administrator : /var/root : /bin/sh
```

### [`/etc/shadow`](https://linux.die.net/man/5/shadow)

固定的編碼系統產生的密碼長度必須一致，因此當欄位的長度改變後，該密碼就會失效。很多軟體透過這個特性，在此欄位前加上 ! 或 * 改變密碼欄位長度，讓密碼暫時失效。 

```
login name: 帳號名稱
encrypted password: 經過編碼加密的密碼
date of last password change: 最近更動密碼的日期，1970/1/1 相差的天數
minimum password age: 密碼不可被更動的天數
maximum password age: 密碼需要重新變更的天數
password warning period: 密碼需要變更期限前的警告天數
password inactivity period: 密碼失效日
account expiration date: 帳號失效日
reserved field: 保留
```

### 參考資料

 * [Linux 的帳號與群組 / 鳥哥的 Linux 私房菜](http://linux.vbird.org/linux_basic/0410accountmanager.php#account)

## 新增使用者

`useradd` 用來新增使用者。

> Mac 使用 [`dscl`](https://ss64.com/osx/dscl.html)。

`-u` ：指定一個特定的 UID
`-r` ：建立一個系統的帳號，預設不會主動建立家目錄
`-g` ：initial group

使用 useradd 建立了帳號之後，在預設的情況下，該帳號是暫時無法登入的，需要設置密碼。

`passwd` 設置密碼。

## 使用者訊息傳遞

### [`write`](https://linux.die.net/man/1/write)

可以用 `$ who -T` 來查詢 user、tty、可否**傳送訊息**等狀態。

```shell
$ write <user> <ttyname>
Write something...
```

### [`mesg`](https://linux.die.net/man/1/mesg)
可以透過 `mesg` 來**開關訊息**。

```shell
$ mesg <y|n>
```

### [`wall`](https://linux.die.net/man/1/wall)

**廣播**的方式對所有系統上面的使用者傳送，包括自己。

```shell
$ wall
Write something...[Ctrl-D]
```