---
# System prepended metadata

title: LINUX COMMAND NOTE
tags: [Linux, CLI]

---

# LINUX COMMAND NOTE
###### tags: `Linux` `CLI`

### port and services reference
Linux : /etc/services

Windows : C:\Windows\System32\drivers\etc\services

windows:
netstat -ano | select-string 443

linux:
netstat ano | grep 443

---
---

### find
#find / -name virtualenv 
>於跟目錄"/"尋找名稱為virtualenv檔案


---
---
### grep
#grep -rns technawi /etc/
>在/etc內尋找有'technawi'之檔案

---
---

### Docker
#docker pull amancevice/superset:0.18.5 
>載指定版本

#docker run --detach --name superset amancevice/superset:1.4.1
>背景執行container，hostname設定為superset

#docker exec -it superset ls -al
對superset容器執行指令ls -al

---
---
### python
virtualenv
Activate:
>. ./bin/activate

Deactivate:
>deactivate

---
---
### GUI enable or disable
[reference](https://ithelp.ithome.com.tw/articles/10222726)

[reference 2](https://www.redhat.com/sysadmin/configure-systemd-startup-targets)


launch the GUI from the multi-user.target:

$ sudo systemctl isolate graphical.target

Switch back by specifying the multi-user.target with this command:

$ sudo systemctl isolate multi-user.target

Use the following systemctl command to configure the default startup target as the CLI:

$ sudo systemctl set-default multi-user.target

Change tty 

Ctrl + Alt + F1~F6 (F7 is GUI)

---
---
### tmux
[reference](https://blog.gtwang.org/linux/linux-tmux-terminal-multiplexer-tutorial/)

[reference 2](https://andyyou.github.io/2017/11/27/tmux-notes/)

- Windows
若要建立與管理多個 windows 視窗，可以使用以下的操作組合鍵：

| 組合鍵 | 說明 |
| -------- | -------- |
|Ctrl+b 再輸入 c|建立新 window 視窗|（create）。
|Ctrl+b 再輸入 w|以視覺化選單切換 window 視窗（很好用）。|
|Ctrl+b 再輸入 n|切換至下一個 window 視窗（next）。|
|Ctrl+b 再輸入 p|切換至上一個 window 視窗（previous）。|

- Panes（分割視窗）
在 tmux 的環境中，若想要將 window 視窗分割成多個 pane，並管理建立的 panes，可以使用以下的操作組合鍵：

| 組合鍵 | 說明 | 
| --------     | -------- | 
|Ctrl+b 再輸入 %|垂直分割視窗。|
|Ctrl+b 再輸入 "|水平分割視窗。|
|Ctrl+b 再輸入 o|以輪流方式輪流切換 pane。|
|Ctrl+b 再輸入 方向鍵|切換至指定方向的 pane。|





---
---
# VIM

[reference](https://ppundsh.github.io/posts/6edb/)

### .vimrc
[reference](https://)

vim .vimrc

- syntax on
- set nu
- set mouse=a

### search

/[context search]

### 取代

- 將當前行中所有p1均用p2替代

:s/p1/p2/g 

- 將文件中所有p1均用p2替換

:g/p1/s//p2/g

---
---
### scp檔案傳送
[reference](https://blog.gtwang.org/linux/linux-scp-command-tutorial-examples/amp/)

scp [帳號@來源主機]:來源檔案 [帳號@目的主機]:目的檔案

複製整個目錄內的所有檔案加上 -r 參數



---
---
### wc計數
- wc -l

計算行數


---
---
Proxmox Virtual Environment(PVE)

[Proxmox VE筆記](https://hackmd.io/E3tyLwmSTVCHReXu1ctWbw)

---
貼上多行指令或是設定檔\
[reference](https://zh.wikipedia.org/zh-tw/Here%E6%96%87%E6%A1%A3)
\
Here Document (<<) \
是處理多行文字最方便、可讀性最高的方式，特別適合貼上完整的設定檔。它的語法清晰，且不需要處理太多跳脫字元的問題。

- cat: 將接下來的輸入導向到標準輸出。

- << [分隔符]: 告訴 Shell 接下來的內容是一個 Here Document，直到遇到單獨一行的 [分隔符] 才結束。EOF (End Of File) 是最常用的分隔符，但您可以使用任何不會出現在內容中的字串。

- \>: 將 cat 的輸出重新導向並「覆寫」到指定的檔案。如果想「附加」到檔案末尾，請改用 >>。



語法：
\
cat << [分隔符] > [檔案名稱]\
第一行內容\
第二行內容\
...\
最後一行內容\
[分隔符]\

---
---
## network source list update

(debian 13) update 


保持 /etc/apt/sources.list 檔案空白（或只留下註解）。

在 /etc/apt/sources.list.d/ 目錄下建立一個 debian.sources 檔案來存放官方儲存庫資訊。

按照以下步驟操作：

### 1. 備份並清空舊的 sources.list

Bash

\# 備份
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak

\# 建立一個空白的新檔案
> sudo touch /etc/apt/sources.list
### 2. 建立新的 debian.sources 檔案
使用 vim 建立並編輯這個新檔案：

Bash
> sudo vim /etc/apt/sources.list.d/debian.sources

### 3. 貼上以下內容
這份設定檔包含了 Debian 13 的主要儲存庫、安全性更新和一般更新，等同於我們前一個回答中提供的所有內容。

> \#/etc/apt/sources.list.d/debian.sources
> \# DEB822-style sources list for Debian 13 Trixie

> \# 主要儲存庫\
> X-Repolib-Name: Debian Trixie\
> Types: deb deb-src\
> URIs: http://deb.debian.org/debian\
> Suites: trixie trixie-updates\
> Components: main contrib non-free non-free-firmware

> \# 安全性更新\
> X-Repolib-Name: Debian Security\
> Types: deb deb-src\
> URIs: http://security.debian.org/debian-security\
> Suites: trixie-security\
> Components: main contrib non-free non-free-firmware\
說明：將 trixie 和 trixie-updates 合併在同一個段落中，因為它們的 URIs 和 Components 相同，這是新格式的優點之一。

4. 儲存檔案並更新
儲存後離開 vim (:wq)，然後執行更新：

Bash
> sudo apt update
> sudo apt upgrade

---
---
## cat > filename << 'EOF' 完整語法說明

使用指令"cat" 、導向 "> <<" 以及Here Document (heredoc)"EOF"，完成使用指令輸入多行內容，適用於設定檔(config)

### 🎯 基本語法

```bash
cat > /path/to/file << 'EOF'
多行內容
這裡可以寫YAML、Shell腳本
任何文字
EOF
```

### 🔑 三個關鍵元件

#### 1. `cat > filename`
* `cat`     → 顯示/寫入指令
* `>`       → 覆蓋寫入（清空原檔案）
* `filename` → 目標檔案路徑

#### 2. `<< 'EOF'`（Here Document）
* `<<`      → 多行輸入開始
* `'EOF'`   → 結束標記（**單引號最重要！**）

#### 3. `EOF`（結束標記）
* 必須獨立成一行
* 前面不能有空格
* 與開頭的 `'EOF'` 完全一致

---

### ✅ 為什麼用單引號 `'EOF'`？

#### 單引號（推薦）

```bash
cat > docker-compose.yml << 'EOF'
CMD_DOMAIN=10.0.100.14:3001  # $ 變數不會被展開
EOF
# 結果：字面文字保存
```

#### 雙引號（不推薦）

```bash
cat > test.yml << "EOF"
CMD_DOMAIN=$IP:3001          # $IP 被當變數處理
EOF
```

#### 無引號（危險）

```bash
cat > test.yml << EOF
CMD_DOMAIN=${IP}:3001        # Shell 會解析所有變數+命令
EOF
```

---

### 🚀 POC 實戰範例

```bash
# 完整 POC v1.15（複製就能用）
cat > /opt/kb-poc/docker-compose.yml << 'EOF'
services:
  database:
    image: postgres:13.4-alpine
    container_name: kb-postgres
    environment:
      - POSTGRES_USER=hedgedoc
      - POSTGRES_PASSWORD=password
EOF
```

---

### ⚠️ 常見錯誤與修正

| 錯誤 | 原因 | 修正 |
| :--- | :--- | :--- |
| `EOF` 前面有空格 | Bash 視為內容 | `EOF` 獨立一行 |
| 缺少結束 `EOF` | 持續等待輸入 | 補上結束標記 |
| 用 `"EOF"` | 變數被展開 | 改用 `'EOF'` |
| `>>` 代替 `>` | 追加模式 | 用 `>` 覆蓋 |

---

### 🎉 驗證指令

```bash
# 寫入後立即檢查
cat /opt/kb-poc/docker-compose.yml

# 語法檢查
docker compose config  # 驗證 YAML 語法
```

> **單引號 `'EOF'` 是黃金法則，保證內容一字不改寫入檔案！**





---
---
# content example

### Title
[reference](https://ithelp.ithome.com.tw/articles/10222726)

launch the GUI from the multi-user.target

> launch the GUI from the multi-user.target
>> launch the GUI from the multi-user.target


