# visudo

## /etc/sudoers sudo 簡介

sudo 的執行則僅需要自己的密碼， 甚至可以設定不需要密碼即可執行 sudo。sudo 可以讓你以其他用 戶的身份執行指令 (通常是使用 root 的身份來執行指令)，僅有規範到 /etc/sudoers 內的用戶才能夠執 行 sudo 這個指令。 Mac 系統預設僅有管理者權限的人可以執行 sudo。

## 修改 /etc/sudoers 的方法

使用 visudo 去修改 /etc/sudoers ，讓該帳號能夠使用全部或部分的 root 指令功能。因為 /etc/sudoers 是有設定語法的，如果設定錯誤那會造成無法使用 sudo 指令的不良後果。因此使用 visudo 去修改， 在結束離開修改畫面時，系統會去檢驗 /etc/sudoers 的語法，避免錯誤發生。

```
root@study ~]# visudo
....(前面省略)....
root ALL=(ALL) ALL
i9200800 ALL=(ALL) ALL <==這一行是你要新增的! ....(底下省略)....
```

上面這一行的四個元件意義是:

* 『使用者帳號』:系統的哪個帳號可以使用 sudo 這個指令的意思。
* 『登入者的來源主機名稱』:當這個帳號由哪部主機連線到本 Linux 主機，意思是這個帳號可能

  是由哪一部網路主機連線過來的， 這個設定值可以指定用戶端電腦(信任的來源的意思)。預設值

  root 可來自任何一部網路主機。
* 『(可切換的身份)』:這個帳號可以切換成什麼身份來下達後續的指令，預設 root 可以切換成任

  何人。
* 『可下達的指令』:可用該身份下達什麼指令?這個指令請務必使用絕對路徑撰寫。 預設 root 可

  以切換任何身份且進行任何指令之意。

## 進階設定方式

無需密碼，就可以執行 sudo 的方法

```
i9200800  ALL=(ALL)  NOPASSWD: ALL
```

限制的可執行的指令

```
i9200800 ALL=(ALL) /usr/bin/xcode-select
```

使用正規表示式限制指令的部份參數不可使用 以下設定為可以執行『 passwd 任意字元』，但是『 passwd 』與『 passwd root 』這兩個指令例外

```
i9200800 ALL=(ALL) /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd, !/usr/bin/passwd root
```

## App 開發情境的應用

App 開發人員，為了因應每年升級的預做準備，需要安裝多個 Xcode 的版本進行測試。

Xcode 版本的切換，需要有管理者權限才可執行，透過設定 sudo 指令的權限，可讓開發人員不需具備 管理者權限也可以切換不同的 Xcode 版本。

```
使用「終端機」，輸入 sudo xcode-select -s /Applications/Xcode11.1.app 可切換不同的 Xcode 版本
```

因 sudo 命令的限制，也不需擔心開發人員擁有過多權限，當使用者輸入未被授權的指令，即出現以下 提示訊息:

```
i9200800de-iMac:~ $ sudo ls
Password:
Sorry, user i9200800 is not allowed to execute '/bin/ls' as root on i9200800de- iMac.local.
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jacky-chen.gitbook.io/jackychen/others/visudo.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
