# Ｍac

# 【Mac】清除dns快取

<table id="bkmrk-macos-version-comman"><thead><tr><th>MACOS VERSION</th><th>COMMAND</th></tr></thead><tbody><tr><td>macOS 12 (Monterey)</td><td>`sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder`</td></tr><tr><td>macOS 11 (Big Sur)</td><td>`sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder`</td></tr><tr><td>macOS 10.15 (Catalina)</td><td>`sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder`</td></tr><tr><td>macOS 10.14 (Mojave)</td><td>`sudo killall -HUP mDNSResponder`</td></tr><tr><td>macOS 10.13 (High Sierra)</td><td>`sudo killall -HUP mDNSResponder`</td></tr><tr><td>macOS 10.12 (Sierra)</td><td>`sudo killall -HUP mDNSResponder`</td></tr><tr><td>OS X 10.11 (El Capitan)</td><td>`sudo killall -HUP mDNSResponder`</td></tr><tr><td>OS X 10.10 (Yosemite)</td><td>`sudo discoveryutil udnsflushcaches`</td></tr><tr><td>OS X 10.9 (Mavericks)</td><td>`sudo killall -HUP mDNSResponder`</td></tr><tr><td>OS X 10.8 (Mountain Lion)</td><td>`sudo killall -HUP mDNSResponder`</td></tr><tr><td>Mac OS X 10.7 (Lion)</td><td>`sudo killall -HUP mDNSResponder`</td></tr><tr><td>Mac OS X 10.6 (Snow Leopard)</td><td>`sudo dscacheutil -flushcache`</td></tr><tr><td>Mac OS X 10.5 (Leopard)</td><td>`sudo lookupd -flushcache`</td></tr><tr><td>Mac OS X 10.4 (Tiger)</td><td>`lookupd -flushcache`</td></tr></tbody></table>

# 【Mac】brew 切換php版本

#### brew 安裝 特定 php 版本

```shell
#brew install php@{php version}
brew install php@7.3
```

#### brew 切換 php 版本

查詢目前版本

```shell
#-v 查詢版本
php -v

PHP 7.3.33 (cli) (built: Nov 24 2021 13:40:29) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.33, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.33, Copyright (c) 1999-2018, by Zend Technologies
```

切換版本

```shell
# 刪除php7.3 (連結，非相關檔案)
brew unlink php@7.3
# 連結php7.4
brew link php@7.4
```

如果有安裝zsh 要編輯.zshrc

```shell
#vim .zshrc 

export PATH=/usr/local/opt/php@7.4/bin:$PATH
export PATH=/usr/local/opt/php@7.4/sbin:$PATH

```

# 【Quicktime】影片合併分割

[超簡單！在 Mac 電腦裁切、分割、合併多段影片（Quicktime） – 重灌狂人 (briian.com)](https://briian.com/34302/)

# 【Ｍac】保持不休眠語法

終端機執行 caffeinate，直到中斷(Ctrl + c)之前不會休眠

```
caffeinate
```

```shell
#-t 秒數 保持喚醒時間
caffeinate -t 3600
```

# 【 Mac】安裝netdata

```Powershell
$ brew update
$ brew install netdata
$ brew services start netdata
```

```Powershell
# prometheus 格式
http://10.80.84.9:19999/api/v1/allmetrics?format=prometheus
```

# 【zsh】如何設定快捷鍵

編輯登入執行檔

```
vim ~/.zshrc 
```

```shell
# 加上你要設定的alias
alias ll="ls -alF"
```

重新載入或是關掉終端機再開

```shell
. ~/.zshrc
# 或是
source ~/.zshrc
```

# 【Mac】設定路由

### 添加路由

要添加一個新的靜態路由，你可以使用以下命令：

```lang-bash
sudo route -n add -net [目標網段] [網關IP]

```

- `[目標網段]`：你要添加的路由的目標網段。例如，`192.168.1.0/24`。
- `[網關IP]`：通往該目標網段的網關 IP 地址。

示例：

```lang-bash
sudo route -n add -net 192.168.1.0/24 192.168.1.1

```

這會將到達 `192.168.1.0/24` 的流量路由到網關 `192.168.1.1`。

### 刪除路由

要刪除一個已存在的路由，你可以使用以下命令：

```lang-bash
sudo route -n delete -net [目標網段]

```

示例：

```lang-bash
sudo route -n delete -net 192.168.1.0/24

```

這會刪除到達 `192.168.1.0/24` 的路由。

### 查看路由表

要查看當前的路由表，你可以使用：

```lang-bash
netstat -nr

```

或者

```lang-bash
route -n get default

```

這會列出當前所有的路由信息，包括網關、目標網段和路由標誌。

### 注意事項

- 使用 `sudo` 是必要的，因為更改網絡配置需要管理員權限。
- 添加的靜態路由通常不會在重啟後保留。如果需要持久化的路由設置，通常需要編輯網絡配置文件或使用網絡管理工具。
- 小心配置路由，以避免網絡連接問題。

# 【Mac】使用自簽憑證

### 產生憑證

在要放置自簽憑證資料夾

openssl req -x509 -out localhost.crt -keyout localhost.key -days 365 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' -extensions EXT -config &lt;( printf "\[dn\] \\nCN=localhost\\n\[req\]\\ndistinguished\_name = dn\\n\[EXT\]\\nsubjectAltName=DNS:localhost\\nkeyUsage=digitalSignature\\nextendedKeyUsage=serverAuth")

```shell
openssl req -x509 -out localhost.crt -keyout localhost.key -days 365 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' -extensions EXT -config <( printf "[dn] \nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
```

產生憑證檔跟key

localhost.crt  
localhost.key

你可以使用 macOS 的 **Keychain Access（鑰匙圈存取）** 工具將 `localhost.crt` 憑證加入系統的信任憑證清單中。以下是詳細步驟：

---

### 【方法一】用 Terminal 安裝憑證到「系統」鑰匙圈

```bash
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain localhost.crt

```

#### 參數說明：

- `-d`：代表這是一個用來信任的憑證（不是用來簽署的憑證）。
- `-r trustRoot`：將憑證標記為信任根（Trust Root）。
- `-k /Library/Keychains/System.keychain`：安裝到系統層級的鑰匙圈（需要 `sudo` 權限）。
- `localhost.crt`：你生成的憑證檔案。

---

### 【方法二】手動用 GUI 加入（若你想看圖形介面）

1. 開啟 **「鑰匙圈存取」** (`Keychain Access`)
2. 選擇左上角「**系統**」鑰匙圈
3. 拖曳 `localhost.crt` 到右邊的憑證清單中
4. 右鍵點選剛剛新增的 `localhost` 憑證 → 點選「**取得資訊**」
5. 展開「**信任**」區塊
6. 將「**使用此憑證時**」設為「**永遠信任**」
7. 關閉視窗時，系統會要求你輸入管理員密碼以儲存變更

---

### 🧪 驗證是否已信任憑證

你可以使用以下方式確認憑證是否信任：

```bash
security verify-cert -c localhost.crt

```

或是直接在瀏覽器打開 `https://localhost`，若沒有「不受信任」或「警告」的訊息，就代表成功。

# 【Mac】固定網卡mac

**隨機化 MAC (Private Address, Random MAC)**

- 從 macOS Big Sur 開始，Wi-Fi 預設會啟用 **隨機 MAC** 功能，連接某些 SSID 時，系統會產生一個虛擬的 MAC，而不是用真實硬體的 MAC。
- 目的：避免被網路追蹤。
- 你會看到同一台 Mac 連不同 Wi-Fi，MAC 會不一樣。

[![image-1757485342036.png](https://bookstack.treemanou.com/uploads/images/gallery/2025-09/scaled-1680-/xLE1hSFWujMLsjuJ-image-1757485342036.png)](https://bookstack.treemanou.com/uploads/images/gallery/2025-09/xLE1hSFWujMLsjuJ-image-1757485342036.png)

[![image-1757484944440.png](https://bookstack.treemanou.com/uploads/images/gallery/2025-09/scaled-1680-/kol7wp9ORb5x60aC-image-1757484944440.png)](https://bookstack.treemanou.com/uploads/images/gallery/2025-09/kol7wp9ORb5x60aC-image-1757484944440.png)

# 【Mac】指令開關wifi - lan

vim ~/.zshrc

```shell
# networksetup -listallhardwareports 查詢介面

export ETH_IF="en0"    # 實體網卡
export WIFI_IF="en1"   # Wi-Fi

net_to_wifi() {
  sudo ifconfig "$ETH_IF" down
  sudo networksetup -setairportpower "$WIFI_IF" on
  sudo dscacheutil -flushcache
  sudo killall -HUP mDNSResponder
}

net_to_lan() {
  sudo ifconfig "$ETH_IF" up
  sudo networksetup -setairportpower "$WIFI_IF" off
  sudo dscacheutil -flushcache
  sudo killall -HUP mDNSResponder
}

alias towifi='net_to_wifi'
alias tolan='net_to_lan'
```

source ./zshrc

# 【Mac】查詢dns

```shell
scutil --dns
```

在 mac 上要看「目前正在用哪幾個 DNS」，最準的是看系統實際套用到每個網路介面的設定（Wi-Fi / 有線可能不同）。你可以用下面幾種方式：

## 1) GUI 方式（最直覺）

1. **系統設定** → **網路**
2. 選你正在用的介面（例如 **Wi-Fi** 或 **乙太網路**）
3. 點 **詳細資訊 / 進階** → **DNS**
4. 你會看到 **DNS 伺服器**清單（目前套用的）

> 這裡顯示的是你手動填的 + DHCP 下發的（視版本介面不同）

## 2) CLI 方式（最準，直接看目前介面）

### 看整台 Mac 所有網路服務的 DNS（推薦）

```bash
scutil --dns

```

你會看到多組 `resolver #`，裡面有 `nameserver[0] : x.x.x.x`  
通常 **優先看 `order` 最小**、以及 `if_index` 對應你正在用的介面那組。

### 只看某個網路服務（例如 Wi-Fi / Ethernet）

先列出網路服務名稱：

```bash
networksetup -listallnetworkservices

```

再看某個服務的 DNS（例如 Wi-Fi）：

```bash
networksetup -getdnsservers "Wi-Fi"

```

乙太網路則可能叫：

```bash
networksetup -getdnsservers "Ethernet"

```

## 3) 快速判斷「目前預設走哪個介面」

```bash
route get default | grep interface

```

會回傳像 `interface: en0`（通常 en0 可能是有線或 Wi-Fi，依機型/設定而定）

---

# 【除錯】【Mac】crontab 無法正常執行

在 macOS 環境下，`crontab` 沒執行的原因通常與 Linux 大不相同，最常見的元凶是 **macOS 嚴格的隱私權與安全性限制（TCC）**，其次是**排程時間定義**或**環境變數路徑**問題。

以下是排查 macOS Crontab 沒有執行（或執行失敗）的精準步驟：

### 原因一：macOS 系統權限封鎖（最常見原因）

從 macOS Mojave (10.14) 開始，系統引入了 TCC 隱私保護。**`cron` 程式預設沒有權限讀取使用者的家目錄（如 `/Users/srou/shell/...`）**。當排程時間到了，`cron` 試圖去讀取腳本時，會直接被系統阻擋（Permission denied），而且這種阻擋**不會**寫入您的自訂 log 中。

#### 🛠️ 解決步驟：

<div aria-busy="false" aria-live="polite" id="bkmrk-%E6%89%93%E9%96%8B-mac-%E7%9A%84-%E3%80%8C%E7%B3%BB%E7%B5%B1%E8%A8%AD%E5%AE%9A%E3%80%8D-%28sys"><div aria-busy="false" aria-live="polite">1. 打開 Mac 的 **「系統設定」 (System Settings)**。
2. 進入 **「隱私權與安全性」 (Privacy &amp; Security)** -&gt; **「全權硬碟存取權」 (Full Disk Access)**。
3. 檢查清單中是否有 **`cron`**。
4. 如果沒有（通常預設沒有）：
    
    
    - 點擊下方的 **「+」** 號。
    - 按下 `Command + Shift + G` 彈出路徑輸入框。
    - 輸入 `/usr/sbin/cron` 並點選開啟。
5. 將 `cron` 的開關切換為開啟（允許）狀態。

</div></div>### 原因二：Crontab 時間格式設定不符合預期

您的設定為：

<div aria-busy="false" aria-live="polite" id="bkmrk-%2A%2F5-%2A-%2A-%2A-1-5-%2Fusers"><div aria-busy="false" aria-live="polite"><div data-hveid="0" data-ved="0CAAQhtANahgKEwi46t3YrMSUAxUAAAAAHQAAAAAQuwI">```
*/5 * * * 1-5 /Users/AAA/shell/clean_mangodb.sh 2025-02-20

```

</div>- **`*/5`**：每 5 分鐘執行一次。
- **`1-5`**：週一至週五（Monday to Friday）。
- **今天是 2026 年 5 月 19 日（星期二）**，時間符合週一至週五。
- **排查點**：請確認您測試當下的時間是否在週一至週五。如果是週末測試，它確實不會觸發。

</div></div>### 原因三：沒有擷取錯誤輸出，導致失敗卻看不到

目前您的 `clean_mangodb.sh` 這一行**沒有加上錯誤重導向**。如果腳本在啟動時就因為路徑或權限問題掛掉，您完全無法得知原因。

#### 🛠️ 解決步驟：

請修改 crontab，將標準錯誤輸出（stderr）導向暫存檔：

<div aria-busy="false" aria-live="polite" id="bkmrk-%E8%BC%B8%E5%85%A5-crontab--e-%E5%B0%87%E8%A9%B2%E8%A1%8C%E4%BF%AE%E6%94%B9%E7%82%BA"><div aria-busy="false" aria-live="polite">1. 輸入 `crontab -e`
2. 將該行修改為（加上 `>> /tmp/clean.log 2>&1`）：
    
    <div data-hveid="0" data-ved="0CAAQhtANahgKEwi46t3YrMSUAxUAAAAAHQAAAAAQvAI"><div><div>```
    */5 * * * 1-5 /Users/AAA/shell/clean_mangodb.sh 2025-02-20 >> /tmp/clean.log 2>&1
    
    ```
    
    </div></div></div>
3. 儲存離開後，靜待下一個 5 分鐘，然後查看 `/tmp/clean.log` 的內容。

</div></div>### 原因四：macOS `cron` 服務未啟動

雖然 macOS 預設會啟動 `cron`，但有時可能被關閉。macOS 負責管理後台服務的是 `launchd`。

#### 🛠️ 檢查與重啟步驟：

檢查 `cron` 是否在運行：

<div aria-busy="false" aria-live="polite" id="bkmrk-sudo-launchctl-list-"><div aria-busy="false" aria-live="polite"><div data-hveid="0" data-ved="0CAAQhtANahgKEwi46t3YrMSUAxUAAAAAHQAAAAAQvQI"><div><div>```
sudo launchctl list | grep cron

```

</div></div></div></div></div>如果沒有輸出，或是您想強制重載 `cron` 服務，請執行：

<div aria-busy="false" aria-live="polite" id="bkmrk-%23-%E5%81%9C%E6%AD%A2%E6%9C%8D%E5%8B%99-sudo-launchct"><div aria-busy="false" aria-live="polite"><div data-hveid="0" data-ved="0CAAQhtANahgKEwi46t3YrMSUAxUAAAAAHQAAAAAQvgI"><div><div><button aria-label="複製代碼" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div>```
<span class="hljs-comment"># 停止服務</span>
sudo launchctl unload /System/Library/LaunchDaemons/com.vix.cron.plist 2>/dev/null
<span class="hljs-comment"># 重新啟動服務</span>
sudo launchctl load /System/Library/LaunchDaemons/com.vix.cron.plist

```

</div></div></div>### 原因五：環境變數（PATH）問題

`cron` 執行時的環境變數非常乾淨，通常 `PATH` 只有 `/usr/bin:/bin`。

如果您的 `clean_mangodb.sh` 腳本內容中呼叫了某些透過 Homebrew 安裝的工具（雖然您目前主要使用 `curl`、`sed`，這些在 `/usr/bin` 都有），但若腳本有用到 `/usr/local/bin` 或 `/opt/homebrew/bin` 的套件，就會噴出 `command not found`。

<div aria-busy="false" aria-live="polite" id="bkmrk-%E9%A9%97%E8%AD%89%E6%96%B9%E5%BC%8F%EF%BC%9A%E9%80%8F%E9%81%8E%E4%B8%8A%E8%BF%B0%E5%8E%9F%E5%9B%A0%E4%B8%89%E5%8A%A0%E4%B8%8A-2%3E%261-"><div aria-busy="false" aria-live="polite">- **驗證方式**：透過上述**原因三**加上 `2>&1` 導出 log 後，最容易看出來是否卡在找不到指令。

</div></div>### 📋 建議排查順序

<div aria-busy="false" aria-live="polite" id="bkmrk-%E5%85%88%E5%8E%BB-%E5%85%A8%E6%AC%8A%E7%A1%AC%E7%A2%9F%E5%AD%98%E5%8F%96%E6%AC%8A-%E8%A3%9C%E4%B8%8A-%2Fusr%2Fs">1. 先去 **全權硬碟存取權** 補上 `/usr/sbin/cron` 的權限（90% 是這個問題）。
2. 用 `crontab -e` 把日誌重導向 `>> /tmp/clean.log 2>&1` 補上。
3. 檢查 `/tmp/clean.log` 的報錯訊息。

</div>