{"id":20619662,"url":"https://github.com/twtrubiks/linux-note","last_synced_at":"2025-04-13T00:47:11.674Z","repository":{"id":84518969,"uuid":"215809649","full_name":"twtrubiks/linux-note","owner":"twtrubiks","description":"主要是紀錄一些 linux 的指令📝","archived":false,"fork":false,"pushed_at":"2025-04-09T12:40:41.000Z","size":239,"stargazers_count":216,"open_issues_count":0,"forks_count":72,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-13T00:47:05.492Z","etag":null,"topics":["linux","note","tmux","tutorials","zsh"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/twtrubiks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-17T14:14:27.000Z","updated_at":"2025-04-09T12:40:45.000Z","dependencies_parsed_at":"2024-03-13T03:22:48.078Z","dependency_job_id":"c1933fc0-230b-488b-a973-d0b47d6a118a","html_url":"https://github.com/twtrubiks/linux-note","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Flinux-note","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Flinux-note/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Flinux-note/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Flinux-note/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twtrubiks","download_url":"https://codeload.github.com/twtrubiks/linux-note/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248650433,"owners_count":21139672,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["linux","note","tmux","tutorials","zsh"],"created_at":"2024-11-16T12:12:13.363Z","updated_at":"2025-04-13T00:47:11.664Z","avatar_url":"https://github.com/twtrubiks.png","language":"Shell","readme":"# linux-note\n\n主要是紀錄一些 linux 的指令📝\n\n( 本篇文章會持續更新 :smile: )\n\n## cd\n\n切換到家目錄 `~`\n\n```cmd\ncd ~\n```\n\n切換到根目錄 `/`\n\n```cmd\ncd /\n```\n\n回到上層目錄\n\n```cmd\ncd ..\n```\n\n移動路徑到上一個所在的路徑 (可以快速切換兩個路徑, 很方便 :smile:)\n\n```cmd\ncd -\n```\n\n## man\n\n線上說明手冊 ( man page )\n\n```cmd\nman ls\n```\n\n![alt tag](https://i.imgur.com/3DDi208.png)\n\n也可以使用\n\n```cmd\nls --help\n```\n\n![alt tag](https://i.imgur.com/ZSZjuVC.png)\n\n## pwd\n\n查看目前的路徑\n\n```cmd\npwd\n```\n\n## ls\n\n* [Youtube Tutorial - Linux 指令教學 - ls](https://youtu.be/3Zy1AWuDUHE)\n\n列出檔案\n\n```cmd\nls -l\n```\n\n`-l` 顯示詳細的資訊 ( 檔案權限 )。\n\n也等於直接輸入 (L 的小寫)\n\n```cmd\nll\n```\n\n在 Linux 中，檔案都擁有四種權限\n\n* 可讀取 ( r，Readable )，用數字 4 表示。\n\n* 可寫入 ( w，writable )，用數字 2 表示。\n\n* 可執行 ( x，eXecute )，用數字 1 表示。\n\n* 無權限 ( - )，用數字 0 表示。\n\n為了更清楚，我把它整理成表格 :yum:\n\n|     字元     | 權限分數 |\n|:------------:|:--------:|\n|   r (read)   |     4    |\n|   w (write)  |     2    |\n|  x (execute) |     1    |\n|    - 無權限  |     0    |\n\n如下圖所示，\n\n![alt tag](https://i.imgur.com/AzfYBhf.png)\n\n接著說明裡面每一欄的意思，\n\n![alt tag](https://i.imgur.com/3TMcAtC.png)\n\n* 第一欄 ( 圖上編號 1 )，使用者權限。\n\n由 10 個字元組成，\n\n第一個字元代表檔案型態 (`-` 為檔案，`d` 為目錄，`l` 為連結檔案 )。\n\n第二、三、四個字元 表示檔案擁有者的存取權限。\n\n第五、六、七個字元 表示檔案擁有者所屬群組成員的存取權限。\n\n第八、九、十個字元 表示其他使用者的存取權限。\n\n來看一個例子，drwxr-xr-x，\n\n代表它是一個目錄，\n\n擁有者具備讀、寫、執行權限，\n\n所屬群組只擁有讀、執行權限，\n\n其他使用者只擁有讀、執行權限。\n\n為了更清楚，我把它整理成表格 :yum:\n\n|                |        擁有者        |      所屬群組      |     其他使用者     |\n|----------------|:--------------------:|:------------------:|:------------------:|\n|        d       |          rwx         |         r-x        |         r-x        |\n| 代表是一個目錄 | 具備讀、寫、執行權限 | 只擁有讀、執行權限 | 只擁有讀、執行權限 |\n\n它的權限分數是 755\n\n|  身份  \t| 權限 \t|   分數   \t|\n|:------:\t|:----:\t|:--------:\t|\n|  owner \t|  rwx \t| 4+2+1 =7 \t|\n|  group \t|  r-x \t| 4+0+1 =5 \t|\n| others \t|  r-x \t| 4+0+1 =5 \t|\n\n* 第二欄 ( 圖上編號 2 )，檔案數量。\n\n* 第三欄 ( 圖上編號 3 )，擁有者。\n\n* 第四欄 ( 圖上編號 4 )，群組。\n\n* 第五欄 ( 圖上編號 5 )，檔案大小。\n\n* 第六欄 ( 圖上編號 6 )，檔案建立時間。\n\n* 第七欄 ( 圖上編號 7 )，檔案名稱。\n\nls 使用時間排序\n\n```cmd\nls -t\n```\n\n列出特定檔案 ( 列出為 .py 的檔案 )\n\n```cmd\nls *.py\n```\n\n`-h` 參數，使用 KB、MB、GB 單位顯示檔案或目錄大小。\n\n```cmd\nls -l -h\n```\n\n顯示全部的檔案 (包含隱藏檔)\n\n```cmd\nls -a\n```\n\n也可以使用\n\n```cmd\nls -al\n```\n\n可以直接列出資料夾內的內容\n\n```cmd\nls Downloads\n```\n\n像是在 home 底下, 直接列出 Downloads 內容\n\n![alt tag](https://i.imgur.com/Dal7aSn.png)\n\nsort\n\n```cmd\nls -S\n```\n\n將輸出結果 stdout 寫到文件裡, 可使用 redirect `\u003e` (螢幕上不會顯示)\n\n```cmd\nls -lS \u003e file.txt\n```\n\n計算路徑底下有多少個檔案\n\n```cmd\nls | wc -l\n```\n\n## sort\n\n* [Youtube Tutorial - Linux 指令教學 - sort , uniq](https://youtu.be/5G9gRLPBW_U)\n\n顧名思義就是排序.\n\n假設有一個 `test.txt` 如下,\n\n```txt\nc 2\na 4\ny 33\nb 111\ne 44\nj 3\nk 12\n```\n\n預設是看最前面排序.\n\n```cmd\n❯ sort test.txt\na 4\nb 111\nc 2\ne 44\nj 3\nk 12\ny 33\n```\n\n反向可以加上 `-r`, `--reverse` reverse the result of comparisons\n\n```cmd\n❯ sort -r test.txt\ny 33\nk 12\nj 3\ne 44\nc 2\nb 111\na 4\n```\n\n也可以搭配其他指令使用, 像是\n\n```cmd\ncat test.txt | sort\n```\n\n指定欄位下去排序.\n\n```cmd\n❯ sort -n -k 2 test.txt\nc 2\nj 3\na 4\nk 12\ny 33\ne 44\nb 111\n```\n\n`-n`, `--numeric-sort` 代表使用數字下去排序.\n\n`-k`, `--key=KEYDEF` 代表指定欄位排序. 這邊指定第二個欄位.\n\n這邊多補充一下, 如果是像上面空格格開, 不用特別設定(因為預設),\n\n如果今天你的文件如下, 是用逗點隔開的,\n\n需要多加上 `-t` 設定你的分隔符號.\n\n`-t`, `--field-separator=SEP` use SEP instead of non-blank to blank transition.\n\n`test2.txt` 如下,\n\n```txt\nc,2\na,4\ny,33\nb,111\ne,44\nj,3\nk,12\n```\n\n```cmd\n❯ sort -n -t , -k 2 test2.txt\nc,2\nj,3\na,4\nk,12\ny,33\ne,44\nb,111\n```\n\n透過 `-t` 設定使用 `,` 當作分隔符號.\n\n## uniq\n\n* [Youtube Tutorial - Linux 指令教學 - sort , uniq](https://youtu.be/5G9gRLPBW_U)\n\n用來找出(刪除)重複的行.\n\n```cmd\n❯ uniq --help\n......\nFilter adjacent matching lines from INPUT (or standard input),\nwriting to OUTPUT (or standard output).\n......\nNote: 'uniq' does not detect repeated lines unless they are adjacent.\nYou may want to sort the input first, or use 'sort -u' without 'uniq'.\n......\n```\n\n請注意, 使用 `uniq` 的時候, 請先執行 `sort`.\n\n因為 `uniq` 是去找鄰近的行做比較而已, 所以你必須先 `sort` 再進行 `uniq`.\n\n( 上面說明中也有說 `uniq` 不偵測重複的行, 除非他們是鄰近的 )\n\n範例 `test.txt` 如下,\n\n```txt\n11\n33\n66\n44\n55\n66\n55\n11\n66\n33\n```\n\n如果你沒有先執行 `sort`, 直接執行 `uniq`, 你會發現是無效的,\n\n```cmd\n❯ uniq test.txt\n11\n33\n66\n44\n55\n66\n55\n11\n66\n33\n```\n\n將檔案內重複的行去掉,\n\n```cmd\n❯ sort test.txt | uniq\n11\n33\n44\n55\n66\n```\n\n也可以使用 `sort -u` 代替,\n\n```cmd\n❯ sort -u test.txt\n11\n33\n44\n55\n66\n```\n\n`-u`, `--unique` with -c, check for strict ordering.\n\n計算重複行出現的次數,\n\n```cmd\n❯ sort test.txt | uniq -c\n      2 11\n      2 33\n      1 44\n      2 55\n      3 66\n```\n\n`-c`, `--count` prefix lines by the number of occurrences.\n\n如果你有空白行, 可以加上 sed 指令去掉空白行(如下範例)\n\n```cmd\nsort test.txt | sed '/^$/d' | uniq -c\n```\n\n輸出全部重複的行,\n\n```cmd\n❯ sort test.txt | uniq -D\n11\n11\n33\n33\n55\n55\n66\n66\n66\n```\n\n`-D` print all duplicate lines\n\n只輸出重複的行 (只顯示一次),\n\n```cmd\n❯ sort test.txt | uniq -d\n11\n33\n55\n66\n```\n\n`-d`, `--repeated` only print duplicate lines, one for each group\n\n只輸出沒有重複的行,\n\n```cmd\n❯ sort test.txt | uniq -u\n44\n```\n\n`-u`, `--unique` only print unique lines\n\n## cut\n\n用來擷取部份字元.\n\n範例 `test.txt`\n\n```text\n123\n234\n567\n890\n```\n\n擷取第2個到第3個字元\n\n```cmd\n❯ cut -c 2-3 test.txt\n23\n34\n67\n90\n```\n\n`-c`, `--characters=LIST`  select only these characters\n\n擷取第2個到最後一個字元\n\n```cmd\n❯ cut -c 2- test.txt\n23\n34\n67\n90\n```\n\n擷取第1個和第3個字元\n\n```cmd\n❯ cut -c 1,3 test.txt\n13\n24\n57\n80\n```\n\n排除第2個字元\n\n```cmd\n❯ cut -c 2 test.txt --complement\n13\n24\n57\n80\n```\n\n`--complement` complement the set of selected bytes, characters or fields.\n\n(補足其他字元, 意思就是排除指定的字元)\n\n## tee\n\n同時將輸出結果 stdout 寫到文件裡以及顯示在螢幕上 (直接覆寫掉 file.txt)\n\n```cmd\nls | tee file.txt\n```\n\n同時將輸出結果 stdout 寫到文件裡以及顯示在螢幕上 (附加在 file.txt 之後)\n\n```cmd\nls | tee -a file.txt\n```\n\n##  touch\n\n很常使用拿來建立空檔案\n\n```cmd\ntouch file.py\n```\n\n也可以透過這個方式一次建立多個空檔案 ( `file1.py` ~ `file1.py`)\n\n```cmd\ntouch file{1..10}.py\n```\n\n## su\n\n切換不同的 user\n\n```cmd\nsu \u003cusername\u003e\n```\n\n## sudo\n\n增加新的 user\n\n```cmd\nsudo useradd \u003cusername\u003e\n```\n\n設定 user 的 password\n\n```cmd\nsudo passwd \u003cusername\u003e\n```\n\n刪除 user\n\n```cmd\nsudo userdel \u003cusername\u003e\n```\n\n增加新的 group\n\n```cmd\nsudo groupadd \u003cgroupname\u003e\n```\n\n刪除 group\n\n```cmd\nsudo groupdel \u003cgroupname\u003e\n```\n\n增加 user 到 group 中\n\n```cmd\nsudo usermod -g \u003cgroupname\u003e \u003cusername\u003e\n```\n\n查看所有 user\n\n```cmd\nsudo cat /etc/passwd\n```\n\n查看所有 group\n\n```cmd\nsudo cat /etc/group\n```\n\n不知道大家有沒有這個困擾, 就是每次都要打上自己的密碼很麻煩 :expressionless:\n\n這邊提供一個方法給各位, 但還是要小心一點, 就是 `-S` 這個指令.\n\n```text\nThe -S (stdin) option causes sudo to read the password from\nthe standard input instead of the terminal device.\n```\n\n簡單說, 就是先打上你自己的密碼, 這樣就不用再打一次了, 以下舉例\n\n```cmd\necho YourPwd | sudo -S groupadd \u003cgroupname\u003e\n```\n\n## chmod\n\n* [Youtube Tutorial - Linux 教學 - chmod](https://youtu.be/qwk4Pzgtf2I)\n\nchmod 為 change mode 的縮寫.\n\n改變檔案權限\n\n```cmd\nchmod XXX filename\n```\n\n舉個例子，將權限設為 rw-rw-r--，\n\n|  身份  \t| 權限 \t|   分數   \t|\n|:------:\t|:----:\t|:--------:\t|\n|  owner \t|  rw- \t| 4+2+0 =6 \t|\n|  group \t|  rw- \t| 4+2+0 =6 \t|\n| others \t|  r-- \t| 4+0+0 =4 \t|\n\n```cmd\nchmod 664 README.md\n```\n\n常用修改權限的指令\n\n```cmd\n# 只有擁有者 owner 有讀和寫的權限\nsudo chmod 600 ×××\n```\n\n```cmd\n# 擁有者 owner 有讀和寫的權限，group，others 只有讀的權限\nsudo chmod 644 ×××\n```\n\n```cmd\n# 擁有者 owner 有讀和寫以及執行的權限\nsudo chmod 700 ×××\n```\n\n```cmd\n# 擁有者 owner，group，others 都有讀和寫的權限\nsudo chmod 666 ×××\n```\n\n```cmd\n# 擁有者 owner，group，others 都有讀和寫以及執行的權限，基本上就是全開\nsudo chmod -R 777 xxx\n```\n\n`-r` `-R` 代表 recursive 遞迴 ( 目錄底下所以檔案包含子目錄都會變更 )，\n\n還有一種方法是使用 符號 來改變權限，\n\n在介紹之前，先看下方的表格 :wink:\n\n|       | u = user  |          |             |              |\n|-------|-----------|----------|-------------|--------------|\n|       | g = group | + (增加) | r = read    |              |\n| chmod |           | - (移除) | w = write   | 檔案或資料夾 |\n|       | o = other | = (設定) | x = execute |              |\n|       | a = all   |          |             |              |\n\n舉個例子，將 hello 權限設為 rw-rw-r--，\n\n|  擁有者(u)  \t| 所屬群組(g) \t|   其他使用者(o)   \t|\n|:------:\t|:----:\t|:--------:\t|\n|  rw- \t|  rw- \t| r-- \t|\n\n```cmd\nchmod ug=rw,o=r hello\n```\n\n![alt tag](https://i.imgur.com/QgNuNel.png)\n\n再舉個例子，將 hello 權限設為 rwxr-xr–-，\n\n```cmd\nchmod u=rwx,g=rx,o=r hello\n```\n\n![alt tag](https://i.imgur.com/WlX8wPL.png)\n\n接著假設我希望把 可執行的權限(x) 加上去 (全部人及群組都加上)\n\n```cmd\nchmod a+x hello\n```\n\n![alt tag](https://i.imgur.com/KLiwPXX.png)\n\n移除所有人 可執行的權限(x)\n\n```cmd\nchmod a-x hello\n```\n\n你會發現大家的 可執行的權限(x) 都消失了\n\n![alt tag](https://i.imgur.com/O8gh3Is.png)\n\n相信經過這一連串的練習，大家肯定了解了，\n\n如果不懂，多看幾遍 :satisfied:\n\n## chown\n\n修改檔案或目錄的擁有者與群組。\n\n修改檔案或目錄的擁有者\n\n```cmd\n# 將 README.md ( 檔案 ) 的擁有者改為 twtrubiks ( 使用者 )\nchown twtrubiks README.md\n```\n\n修改檔案或目錄的群組\n\n```cmd\n# 將 README.md ( 檔案 ) 的群組改為 twtrubiksgroup ( 群組 )\nchown :twtrubiksgroup README.md\n```\n\n同時修改檔案或目錄的擁有者和群組\n\n```cmd\n# 將 README.md ( 檔案 ) 的擁有者改為 twtrubiks ( 使用者 ) 以及\n# 將 README.md ( 檔案 ) 的群組改為 twtrubiksgroup ( 群組 )\nchown twtrubiks:twtrubiksgroup README.md\n```\n\n## ln\n\n* [Youtube Tutorial - Linux 指令教學 - ln (Symbolic Link)](https://youtu.be/jdZsO2GAf2I)\n\n有兩種, 分別為 hard link 和 Symbolic link ( soft link ),\n\n先介紹 hard link，注意，hard link not allowed for directory。\n\n```cmd\nln /home/twtrubiks/Downloads/odoo-git/README.md\n```\n\n![alt tag](https://i.imgur.com/ioJXBRw.png)\n\nhard link 特性為不管刪除哪一個檔案，檔案都會被保留。除非你把最後一個檔案也刪除，\n\n換個方式說，一個檔案的 hard link 和本來的檔案其實沒有任何實質上的區別。\n\nhard link 不允許資料夾，只允許檔案。\n\nsymbolic link，也稱 soft link，基本上它類似於 Windows 中的捷徑 :smile:\n\n```cmd\nln -s /home/twtrubiks/Downloads/odoo-git/ dir-link\n```\n\n![alt tag](https://i.imgur.com/JGhlQZd.png)\n\n當某個檔案的的本體被刪除後，它的 symbolic link 就無法讀取到這個檔案了，\n\n一個檔案的 symbolic link 和檔案的本體是不同的兩個東西。\n\nsymbolic link 允許檔案和資料夾。\n\n## zip unzip\n\nzip 3.0 已經會保存檔案的 permissions and ownership.\n\n```cmd\nsudo apt-get install zip unzip\n```\n\nzip\n\n```cmd\nzip -r \u003c壓縮後的檔名\u003e \u003c壓縮的檔案\u003e\nzip -r file.zip file\n```\n\nunzip\n\n```cmd\nunzip \u003c解壓縮的檔案\u003e -d \u003c解壓縮的目標資料夾\u003e\nunzip file.zip -d zip_extract\n```\n\n如果希望直接解壓縮到當前的目錄，可以直接使用 `.`\n\n```cmd\nunzip file.zip -d .\n```\n\n## tar\n\ntar **會**保存檔案的 permissions and ownership.\n\n壓縮 `.tar` format\n\n```cmd\ntar cvf filename.tar source-folder\n```\n\n解壓縮 `.tar` format\n\n```cmd\ntar xvf filename.tar\n```\n\n## unrar\n\n```cmd\nsudo apt-get install unrar\n```\n\n將 filename.rar 解壓縮到目錄底下\n\n```cmd\nunrar e filename.rar\n```\n\n列出 filename.rar 的資料\n\n```cmd\nunrar l filename.rar\n```\n\n測試 filename.rar 是否完整且正確\n\n```cmd\nunrar t filename.rar\n```\n\n## wget\n\n下載工具\n\n```cmd\nsudo apt-get install wget\n```\n\n下載 URL 指令\n\n```cmd\nwget http://ftp.gnu.org/gnu/wget/wget-1.20.3.tar.gz\n```\n\n指定檔名，請加上 `-O`\n\n```cmd\nwget -O wget.tar.gz http://ftp.gnu.org/gnu/wget/wget-1.20.3.tar.gz\n```\n\n## scp\n\n全名為 Securely Copy,\n\n這個方法適用於 Linux 和 Linux 之間互傳檔案，也適用於 Linux 和 Windows 之間互傳檔案，\n\n假設，Linux ip 為 192.168.56.101，查看 ip 指令如下，\n\n```cmd\nip addr show\n```\n\n![alt tag](https://i.imgur.com/AlAeRoD.png)\n\n確認有安裝 openssh-server\n\n```cmd\nsudo apt-get install openssh-server\n```\n\n使用 `ssh localhsot` 測試\n\n![alt tag](https://i.imgur.com/nYo5NNn.png)\n\n一切正常之後。\n\n從 Windows 上傳送檔案給 Linux ( ip 為 192.168.56.101 )，\n\n在 Windows 上的 cmd 執行以下指令，\n\n```cmd\nscp -rp 檔案 linux的使用者@ip:目標路徑\n```\n\n`-r` 代表 recursive.\n\n`-p` 代表 保存原始檔案的內容 (Preserves modification).\n\n```cmd\nscp -rp file twtrubiks@192.168.56.101:/home/twtrubiks\n```\n\n![alt tag](https://i.imgur.com/0nBrt00.png)\n\n接下來，從 Linux 上拿檔案回 Windows\n\n```cmd\nscp -P 22 linux的使用者@ip:目標路徑 存放的目標位置\n```\n\n`-P` 代表明確指定連接的 port (remote host).\n\n```cmd\nscp -P 22 twtrubiks@192.168.56.101:/home/twtrubiks/linux_file.md .\n```\n\n`.` 代表當下目前路徑 ( 也可以指定其他的路徑 )。\n\n![alt tag](https://i.imgur.com/aMnNlGI.png)\n\nLinux 之間的傳送也是相同的道理 :smile:\n\n## mv\n\n* [Youtube Tutorial - Linux 指令教學 - mv](https://youtu.be/VhyzaEaGnL8)\n\nmove ( rename ) files，**移動檔案**或是**重新命名檔案**。\n\n修改 資料夾 or 檔案 檔名\n\n```cmd\nmv folder folder-new\nmv README.md README_MV.md\n```\n\n移動檔案\n\n```cmd\nmv README.md /examples\n```\n\n```cmd\nmv file.md example/\n```\n\n其他的參數說明(參數可以多個一起使用)，\n\n互動模式 , CLI 會詢問你是否 overwriting files\n\n```cmd\nmv -i source_file path_to_destination/\n```\n\n只更新來源資料夾和目的地不同的檔案\n\n```cmd\nmv -u source_file path_to_destination/\n```\n\n## rm\n\n* [Youtube Tutorial - Linux 指令教學 - rm](https://youtu.be/JqKjBZMXn_I)\n\n刪除檔案\n\n```cmd\nrm file.md\n```\n\n刪除資料夾\n\n```cmd\nrm -rf mydir\n```\n\n`-r` 代表使用 recursive 遞迴刪除。 ( 會將目錄內所有檔案刪除 )\n\n`-f` 代表強制刪除 ( 不會跳出警告 )。\n\n或是使用 rmdir 指令，\n\n```cmd\nrmdir mydir_name\n```\n\n不過要注意，被移除的資料夾裡面必須是空的，否則回無法移除。\n\n刪除特定的副檔名，\n\n```cmd\nrm -f *.zip\n```\n\n也可以這樣\n\n```cmd\nrm -f *demo.zip\n```\n\n## cp\n\n* [Youtube Tutorial - Linux 指令教學 - cp](https://youtu.be/ORl0YUGY728)\n\n複製資料夾\n\n```cmd\ncp -r path_to_source/ path_to_destination/\n```\n\n`-r` `-R` 代表 recursive 遞迴，\n\n如果 path_to_destination 不存在，會自動建立 ;\n\n如果存在，則直接使用。\n\n只想複製資料夾底下的全部內容，\n\n```cmd\ncp -r dir_1/. dir_2\ncp -r dir_1/. .\n```\n\n`.` 代表資料夾內的東西，也可以代表目前所在的地方。\n\n有時候會希望複製時可以保存當時的權限，所以會加上 `-p`。\n\n```cmd\ncp -r --preserve=all path_to_source/ path_to_destination/\n```\n\n`-p` `--preserve` 代表一同複製當下的權限以及擁有者之類的。\n\n其他的參數說明(參數可以多個一起使用)，\n\n互動模式 , CLI 會詢問你是否 overwriting files\n\n```cmd\ncp -i source_file path_to_destination/\n```\n\n不詢問 , 直接 overwriting files\n\n```cmd\ncp -n source_file path_to_destination/\n```\n\n只更新來源資料夾和目的地不同的檔案\n\n```cmd\ncp -u source_file path_to_destination/\n```\n\n印出資訊\n\n```cmd\ncp -v source_file path_to_destination/\n```\n\n## find\n\n查詢檔案\n\n找檔案或資料夾\n\n```cmd\nsudo find / -name \"dir-name\"\nsudo find / -name \"file-name\"\nsudo find / -name \"*.conf\"\n```\n\n在當前目錄下尋找檔名為 README.md\n\n```cmd\nfind . -name README.md\n```\n\n## source\n\nsource 指令通常用於剛修改的初始化文件, 讓它立刻生效, 不必重開機(或登出再登入),\n\n以下例子,\n\n```cmd\nsource demo.sh\n```\n\n在當下的 shell 內去讀取, 執行 demo.sh, 而 demo.sh **需要**有執行權限\n\n(執行權限代表 `chmod +x demo.sh`)\n\nsource 指令也可以簡寫為 `.`\n\n```cmd\n. demo.sh\n```\n\n## sh or bash\n\n使用 `sh` or `bash`執行時, **不需要**有執行權限.\n\n(執行權限代表 `chmod +x demo.sh`)\n\n```cmd\nsh demo.sh\nbash demo.sh\n```\n\n客製化傳值, 底下為 `test.sh`\n\n```sh\n#!/bin/bash\necho \"$0\" # 檔案名稱\necho \"$1\"\necho \"$2\"\necho \"$3\"\n```\n\n執行結果\n\n```cmd\nsh test.sh a1 a2 a3\n```\n\n## ./\n\n直接使用 `./` 執行, **需要**有執行權限.\n\n(執行權限代表 `chmod +x demo.sh`)\n\n當你執行\n\n```cmd\n./demo.sh\n\nchmod +x demo.sh\n./demo.sh\n```\n\n你會發現跳出類似訊息 `bash: ./demo.sh: Permission denied`,\n\n修正方法如下,\n\n```cmd\nchmod +x demo.sh\n./demo.sh\n```\n\n## where\n\n尋找路徑，\n\n舉例，尋找 python3 路徑\n\n```cmd\nwhere python3\nwhich python3\nwhereis python3\n```\n\n## tail\n\n顯示檔案最後幾行內容 (預設是最後 10 行)\n\n```cmd\ntail README.md\n```\n\n一次顯示多個檔案\n\n```cmd\ntail README_1.md README_2.md\n```\n\n指定顯示檔案最後 N 行內容\n\n```cmd\ntail -n 5 README.md\n```\n\n```cmd\ntail README.md -n 5\n```\n\n持續顯示更新內容，通常使用在 server 或看 log\n\n```cmd\ntail -f README.md\n```\n\n也可以搭配 grep 使用, 以下指令是持續追蹤某個值,\n\n```cmd\ntail -f README.md | grep -n 'test'\n```\n\n如果上面的 test 內容是在 10 行之外,\n\n你會找不到, 看你要加行數, 還是再放新的值進去,\n\n再開一個 terminal, 然後執行以下指令,\n\n將 test 加到檔案最末端,\n\n```cmd\necho \"test\" \u003e\u003e README.md\n```\n\n這樣你就會看到訊息了.\n\n## head\n\n既然有 tail, 肯定會有 head :smile:\n\n```cmd\nhead text.py\n```\n\n預設顯示前 10 行資訊.\n\n可以透過 `-n` 指令指定要顯示前 `n` 行\n\n```cmd\nhead -n 3 text.py\n```\n\n## file\n\n檢查檔案類型\n\n```cmd\nfile README.md\n```\n\n## cat\n\n將檔案內容顯示在 terminal 上\n\n```cmd\ncat README.md\n```\n\n顯示行數\n\n```cmd\ncat -n README.md\n```\n\ncat 也可以寫入檔案\n\n```cmd\ncat \u003c\u003cEOT \u003e\u003e hello_4.txt\nline 1\nline 2\nline 3\nEOT\n```\n\n搭配 `grep` 使用, 過濾出 test\n\n```cmd\ncat README.md | grep 'test'\n```\n\n也可以暴力一點, 直接找出該目錄底下的全部結尾是 `.log` 的文件\n\n```cmd\ncat *.log | grep 'test'\n```\n\n## clear\n\nclear the terminal screen ， 快捷鍵為 Ctrl+L\n\n```cmd\nclear\n```\n\n## grep\n\n```cmd\n# 格式\ngrep match_pattern file_name\n```\n\n加上 `--color` 可以把關鍵字加上顏色, 顯示更清楚.\n\n```cmd\ngrep --color \"search name\" README.md\n```\n\n加上 `-C`, 代表要多顯示頭尾的行數,\n\n```cmd\ngrep --color -C 2 \"search name\" README.md\n```\n\n也可以一次搜尋多個檔案\n\n```cmd\ngrep \"name\" README_1.md README_2.md\n```\n\n也可以使用 萬用字元 `*`\n\n```cmd\ngrep \"print\" *.py\n```\n\n排除某個字元\n\n```cmd\ngrep -v \"match_pattern\" README.md\n```\n\n`-v`, `--invert-match` select non-matching lines\n\n如果想要排除某些字元又要搜尋某些字元,\n\n可以依照需求如下使用,\n\n```cmd\ngrep -v \"ignore\" README.md | grep --color \"match_pattern\"\n```\n\n搜尋當下目錄資料夾內容\n\n```cmd\ngrep -r \"search name\" .\n```\n\ncase insensitive case (不區分大小寫)\n\n```cmd\ngrep -i \"name\" README_1.md\n```\n\n顯示行數\n\n```cmd\ngrep -n \"name\" README_1.md\n```\n\n要完全符合 `:80` 才會被撈出來\n\n```cmd\ngrep -w ':80' README_1.md\n```\n\n`-w`, `--word-regexp` 僅比較整個單字.\n\n## sed\n\n這個指令可以達到快速搜尋, 取代, 刪除文字,\n\nsed 主要是針對**行**進行處理, 然後處理的不是原文件, 而是複製出來的文件.\n\n語法\n\n```cmd\nsed -i '/匹配字串/d' textfile\n```\n\n`-i` 加上這個才會寫入你的 textfile, 不然只會顯示在 terminal 上.\n\n刪除 empty lines\n\n```cmd\nsed -i '/^$/d' textfile\n```\n\n刪除有數字 7 的行數\n\n```cmd\nsed -i '/7/d' textfile\n```\n\n刪除第一到第五行\n\n```cmd\nsed -i '1,5d' textfile\n```\n\n刪除從 hello1 到 hello2 之間的所有行數\n\n```cmd\nsed -i '/hello1/, /hello2/d' textfile\n```\n\n替換語法\n\n```cmd\nsed -i 's/匹配字串/替代字串' textfile\n```\n\n將每行出現的第一個 a 替換成 A\n\n```cmd\nsed -i 's/a/A' textfile\n```\n\n將每行出現的全部的 a 替換成 A\n\n```cmd\nsed -i 's/a/A/g' file\n```\n\n`g` 代表替換所有匹配字串\n\n只印出有 `test` 的行\n\n```cmd\nsed -n '/test/p' test.txt\n```\n\n`-n`, `--quiet`, `--silent` suppress automatic printing of pattern space.\n\n`p` Print the current pattern space.\n\nsed 也可以印出文件指定行數,\n\n```cmd\n❯ cat test.txt\n1\n2\n3\n4\n5\n6\n```\n\n顯示特定行數, 顯示第 5 行\n\n```cmd\n❯ sed -n 5p test.txt\n5\n```\n\n顯示第 3 行以及第 5 行\n\n```cmd\n❯ sed -n -e 3p -e 5p test.txt\n3\n5\n```\n\n`-e` script, `--expression=script`\n\nadd the script to the commands to be executed\n\n顯示第 3 行到第 5 行\n\n```cmd\n❯ sed -n 3,5p test.txt\n3\n4\n5\n```\n\n顯示第 1 行到第 3 行, 以及第 5行\n\n```cmd\n❯ sed -n -e 1,3p -e 5p test.txt\n1\n2\n3\n5\n```\n\n## awk\n\n這個指令是一個非常強大的文字分析工具\n\n假設今天我們的輸出如下\n\n![alt tag](https://i.imgur.com/GhPq6sZ.png)\n\n把第 2,3,5,9 列輸出\n\n```cmd\nll | awk '{print $2,$3,$5,$9}'\n```\n\n![alt tag](https://i.imgur.com/o1exYCq.png)\n\n如果覺得醜, 可以用 printf 來排版\n\n```cmd\nll | awk '{printf \"%-5s %-5s %-5s %-5s\\n\", $2,$3,$5,$9}'\n```\n\n![alt tag](https://i.imgur.com/9RQj28o.png)\n\n接過試著來過濾資料,\n\n把 權限分數(第2列)分數是 2 以及 第3列是 twtrubiks 的取出來\n\n```cmd\nll | awk '$2 == \"2\" \u0026\u0026 $3 == \"twtrubiks\" {print $0}'\n```\n\n`$0` 代表整行的所有內容.\n\n![alt tag](https://i.imgur.com/Il9jGFp.png)\n\n還可以進行統計,\n\n把 權限分數(第2列) 的分數進行 sum (排除 total)\n\n先排除掉第一列是 total 字串的資料,\n\nmy_sum 是我們定義的變數.\n\n```cmd\nll | awk '$1 != \"total\" {my_sum+=$2} END{print my_sum}'\n```\n\n![alt tag](https://i.imgur.com/o3yXZnT.png)\n\n也可以撰寫 if 邏輯,\n\n把 權限分數(第2列)的分數為 3 的過濾出來,\n\n接著印出目前行數, 以及把第9列的檔案名稱轉為大寫\n\n```cmd\nll | awk '{if ($2 == \"3\") print NR, toupper($9)}'\n```\n\n`NR` current record number in the total input stream.\n\n![alt tag](https://i.imgur.com/dzlbMAA.png)\n\n`NF` number of fields in the current record.\n\n範例 `test.txt`\n\n```cmd\n❯ cat test.txt\n-rw-rw-r-- 1 twtrubiks twtrubiks 5  4月  2 20:08 a.py\n```\n\n目前的 field 數量,\n\n```cmd\n❯ cat test.txt | awk '{print NF}'\n9\n```\n\n最後一個 field,\n\n```cmd\n❯ cat test.txt | awk '{print $NF}'\na.py\n```\n\n顯示第一個 field,\n\n```cmd\n❯ cat test.txt | awk '{print $1F}'\n-rw-rw-r--\n```\n\n## mkdir\n\n建立資料夾\n\n```cmd\nmkdir -p dir1/dir2\n```\n\n`-p` `--parents` 代表自動建立上層目錄，如果目錄已存在則不會發生錯誤。\n\n## kill\n\n強制停止程式執行.\n\n需要先查到程式的 PID, 使用方法如下,\n\n```cmd\nkill -9 PID\n```\n\n`-9` 立刻強制停止程式執行\n\n## killall\n\nkillall 和 kill 的一個差別是可以使用程式名稱,\n\n不需要先找到程式的 PID,\n\n例如想要強制停止 vlc\n\n```cmd\nkillall vlc\n```\n\n## history\n\n歷史輸入的指令\n\n```cmd\nhistory\n```\n\n```cmd\nhistory | less\n```\n\n![alt tag](https://i.imgur.com/0YKqS3Y.png)\n\n假設今天我不想打指令, 可以直接輸入 `!`+ 數字, 會自動執行該指令.\n\n```cmd\n!1848\n```\n\n再顯示一次最後輸入的指令 (建議加上 sudo)\n\n```cmd\n!!\n```\n\n也可以搭配 grep,\n\n假如我想要找到歷史輸入過 `git` 的指令, 這時候可以使用以下的指令\n\n```cmd\nhistory | grep git\n```\n\n如果我不想一次顯示全部, 可以再搭配 less\n\n```cmd\nhistory | grep git | less\n```\n\n## echo\n\n在 shell 中印出 shell 的值，\n\n設定 EDITOR\n\n```cmd\nexport EDITOR=vim\n```\n\n查看目前的 EDITOR，\n\n```cmd\necho $EDITOR\n```\n\n查看目前的 shell，\n\n```cmd\necho $SHELL\n```\n\n也可以設定環境變數中的 default,\n\n```cmd\n❯ echo ${SECRET_KEY:-secrets}\nsecrets\n```\n\n當你環境變數中有 `SECRET_KEY` 就會取用, 如果沒有設定,\n\n就會使用你定義的 `secrets`.\n\necho 也可以寫入檔案，\n\n方法一\n\n```cmd\necho \"line 1\" \u003e\u003e hello_1.txt\n```\n\n方法二 ( 寫入多行 )\n\n```cmd\necho \"line 1\nline 2\" \u003e\u003e hello_2.txt\n```\n\n方法三 ( 寫入多行 )\n\n```cmd\n{\n    echo 'line1;'\n    echo 'line2;'\n} \u003e\u003e hello_3.txt\n```\n\n## cal\n\n顯示日曆\n\n```cmd\ncal\n```\n\n顯示上個月, 前個月, 下個月\n\n```cmd\ncal -3\n```\n\n顯示特定的年月\n\n格式\n\n```cmd\ncal 月份 年份\n```\n\n範例\n\n```cmd\ncal 12 2022\n```\n\n## du\n\n* [Youtube Tutorial - Linux 指令教學 - du(Disk Usage)](https://youtu.be/JZZoJnasnHE)\n\ndu 這個指令是 Disk Usage 的縮寫,\n\n在開始介紹 du 之前, 先來看一個例子,\n\n使用 `ls -l -h` 觀察 debian 資料夾\n\n![alt tag](https://i.imgur.com/lXgxQop.png)\n\n但是如果你進到資料夾裡面, 你會發現它明明有 17GB,\n\n可是為什麼在資料夾外層看的時候卻只有 4KB :question:\n\n![alt tag](https://i.imgur.com/eOTKWJj.png)\n\n原因是 `ls -l -h` 不會顯示資料夾實際的大小, 只會顯示所謂的 meta information,\n\n所以, 如果你要看實際的大小, 比較好的方法是使用接下來要介紹的 `du` 指令 :smile:\n\n查看 du 指令說明\n\n```cmd\ndu --help\n```\n\n![alt tag](https://i.imgur.com/IQLpqnC.png)\n\n```cmd\n-s, --summarize       display only a total for each argument\n                      (Equivalent to -d 0)\n\n-h, --human-readable  print sizes in human readable format (e.g., 1K 234M 2G)\n    --inodes          list inode usage information instead of block usage\n\n-c, --total           produce a grand total\n\n-d, --max-depth=N     print the total for a directory (or file, with --all)\n                      only if it is N or fewer levels below the command\n                      line argument;  --max-depth=0 is the same as --summarize\n\n\n-a, --all             write counts for all files, not just directories\n    --apparent-size   print apparent sizes, rather than disk usage; although\n                      the apparent size is usually smaller, it may be\n                      larger due to holes in ('sparse') files, internal\n                      fragmentation, indirect blocks, and the like\n```\n\n以下兩個指令功能是相同的\n\n```cmd\ndu -sh *\ndu --summarize --human-readable *\n```\n\n使用剛剛的那個例子, 在資料夾的外層就能看到實際的資料夾大小\n\n![alt tag](https://i.imgur.com/hHjxXDx.png)\n\n也可以搭配 `-d` 使用, 資料夾的層數, 看下面的例子你就會懂了\n\n```cmd\ndu -d 2 -h\n```\n\n![alt tag](https://i.imgur.com/NdbqvSz.png)\n\n## truncate\n\n* [Youtube Tutorial - Linux 指令教學 - truncate](https://youtu.be/w2pwD1AOhPI)\n\nShrink or extend the size of each FILE to the specified size.\n\ntruncate 指令可以將一個檔案縮小或是增加大小.\n\n開始介紹這個指令前, 先來看看適用的情境 :smile:\n\n有時候我們可能會希望把一個檔案的大小歸 0, 也就是將檔案的內容全部刪除,\n\n但是要保留檔案, 這時候就很適合使用這個指令 :smirk:\n\n那你可能會問我, 為什麼不直接刪除檔案再建立一個一模一樣的就好 :question:\n\n原因很簡單, 在 linux 的世界中, 檔案是有權限的, 所以你還要去注意新建立\n\n出來的檔案, 權限是否和之前的一模一樣( 否而可能會導致錯誤 ), 所以比較簡單\n\n的方法會是使用 truncate 這個指令, 它將只會清除內容 ( 檔案大小為 0 ),\n\n其餘的都保持原來的狀態。\n\n查看 truncate 指令說明,\n\n```cmd\ntruncate --help\n```\n\n![alt tag](https://i.imgur.com/rOXR79N.png)\n\n```cmd\nMandatory arguments to long options are mandatory for short options too.\n-c, --no-create        do not create any files\n-o, --io-blocks        treat SIZE as number of IO blocks instead of bytes\n-r, --reference=RFILE  base size on RFILE\n-s, --size=SIZE        set or adjust the file size by SIZE bytes\n    --help     display this help and exit\n    --version  output version information and exit\n\nSIZE may also be prefixed by one of the following modifying characters:\n'+' extend by, '-' reduce by, '\u003c' at most, '\u003e' at least,\n'/' round down to multiple of, '%' round up to multiple of.\n```\n\n使用以下的範例來說明,\n\n假設現在有一個 `demo.txt` 的檔案 (如下)\n\n![alt tag](https://i.imgur.com/nWoxmhn.png)\n\n使用 truncate 將 `demo.txt` 放大到 1M,\n\n```cmd\ntruncate -s 1M demo.txt\n```\n\n![alt tag](https://i.imgur.com/jeZ6Rkp.png)\n\n注意 `du -ah` 是顯示 apparent sizes (不是 disk usage ), 所以大小不會改變.\n\n如果你去打開 `demo.txt`, 你會發現被塞了很多東西, 因為大小要變成 1M :smile:\n\n![alt tag](https://i.imgur.com/mgQNkNn.png)\n\n相反的, 現在使用 truncate 將 `demo.txt` 縮小到 0,\n\n![alt tag](https://i.imgur.com/9czKNL5.png)\n\n如果你去打開 `demo.txt`, 你會發現裡面的資料都消失了.\n\n![alt tag](https://i.imgur.com/vmLwz96.png)\n\ntruncate 這個指令就非常適合去清除 log, 將 log 大小歸 0, 其餘保持原樣.\n\n清空所有日誌文件\n\n```cmd\nsudo truncate -s 0 /var/log/**/*.log\n```\n\n## shred\n\n* [Youtube Tutorial - Linux 指令教學 - tldr , shred , sleep](https://youtu.be/RqI-DF1I8R0?t=172)\n\n銷毀重要的檔案, 防止救援軟體還原,\n\nOverwrite files to securely delete data.\n\n使用方法很簡單,\n\n對 `demo.txt` 進行 shred\n\n```cmd\nshred demo.txt\n```\n\n對 `demo.txt` 進行 shred, 並且留下 zeroes\n\n```cmd\nshred --zero demo.txt\n```\n\n覆蓋檔案 25 次(預設是 3 次)\n\n```cmd\nshred -n25 demo.txt\n```\n\nshred 並且刪除它\n\n```cmd\nshred --remove demo.txt\n```\n\n## sleep\n\n* [Youtube Tutorial - Linux 指令教學 - tldr , shred , sleep](https://youtu.be/RqI-DF1I8R0?t=358)\n\n可以延遲特定的時間, 再執行對應的指令\n\nsleep 0.5秒\n\n```cmd\nsleep 0.5\n```\n\nsleep 1分鐘\n\n```cmd\nsleep 1m\n```\n\nsleep 1小時\n\n```cmd\nsleep 1h\n```\n\n搭配其他的指令, sleep 秒後, 再印出 hello\n\n```cmd\nsleep 1 \u0026\u0026 echo \"hello\"\n```\n\n## ps\n\nps 為 Process Status 的縮寫.\n\n列出目前 shell 底下正在執行的 processes\n\n```cmd\nps\n```\n\n列出全部的 processes\n\n```cmd\nps -A\n```\n\n`-A`, `-e` all processes\n\n使用 BSD format 列出全部的 processes\n\n```cmd\nps aux\n```\n\n`a` all with tty, including other users\n`x` processes without controlling ttys\n`u` user-oriented format\n\n搭配 grep 找出對應的 PS\n\n```cmd\nps aux | grep \"postgres -c\"\n```\n\n使用 PID 找出對應的 PS\n\n```cmd\nps -o pid,rss,vsz,sz,comm -p PID\n```\n\n`RSS` 這個值和 `top` command 中的 `RES` 是相同的,\n\n都可以當成是實體上到底佔用了多少記憶體.\n\n`-o`, `o`, `--format \u003cformat\u003e` user-defined format.\n\n`-p`, `p`, `--pid \u003cPID\u003e` process id\n\n## tree\n\n```cmd\nsudo apt install tree\n```\n\n```cmd\n❯ tree\n.\n├── Git-Flow\n│   └── README.md\n├── git_submodule_turorial.md\n├── git_subtree_turorial.md\n```\n\n只顯示一層文件\n\n`-L` level 代表 Descend only level directories deep.\n\n```cmd\n❯ tree -L 1\n.\n├── auto_crawler_ptt_beauty_image\n├── BBBB\n├── django-celery-tutorial\n├── django-docker-redis-tutorial\n```\n\n## nslookup\n\n找到網址的 ip 以及各種資訊\n\n```cmd\n❯ nslookup google.com\nServer:\t\t127.0.0.53\nAddress:\t127.0.0.53#53\n\nNon-authoritative answer:\nName:\tgoogle.com\nAddress: 142.251.43.14\nName:\tgoogle.com\nAddress: 2404:6800:4012:3::200e\n```\n\n## NTP\n\n全名為 The Network Time Protocol\n\n主要功能為 時間校正,\n\n如果你發現 server 的時間不準, 需要裝上這個, 確保時間有自動校正,\n\n```cmd\nsudo apt install ntp\ncat /etc/ntp.conf\nsudo systemctl status ntp\n```\n\n基本上, 安裝就會自動生效.\n\n## SSH\n\n通常我們 ssh 的格式是, `ssh user@xx.xx.xx.xx`,\n\n但這樣做實在太麻煩了, 有時候還是會忘記,\n\n使用 ssh_config 的方法更快更方便,\n\n先進行設定\n\n```cmd\nsudo vim ~/.ssh/config\n```\n\n內容大致如下\n\n```cmd\n# example\nHost my-remote\nHostName xx.xxx.xx.xx\nPort 22\nIdentityFile ~/.ssh/id_rsa\nIdentitiesOnly yes\nUser root\n```\n\n這樣你只需要在 terminal 打上 `ssh my-remote` 即可.\n\n### SSH 防止斷線\n\n另外不知道大家有沒有 ssh 到遠端的時候,\n\n一陣子沒用, 他就自己斷線, 如果你想改善這個方法,\n\n一樣到 `sudo vim ~/.ssh/config` 底下加上,\n\n```cmd\n# 防止斷線\nHost *\n    ServerAliveInterval 100\n```\n\n意思為每 100 秒送一個封包到主機上，用以保持連線.\n\n單位是秒, 這樣你就不會一下沒用就斷線了.\n\n## 不用密碼遠端登入 Linux\n\n### 方法一\n\n先確認 Linux 上有 `.ssh` 資料夾，如果沒有，\n\n請使用以下指令建立 ( 以及權限 )，\n\n```cmd\nmkdir -p ~/.ssh\nchmod 700 ~/.ssh\n```\n\n每次遠端登入 Linux 都需要密碼很麻煩，有沒有可以透過其他的方式不要輸入密碼 :question:\n\n有，先在本機電腦使用 `ssh-keygen` 產生金鑰\n\n```cmd\nssh-keygen\n```\n\n接著你會有兩把 key ,\n\nid_rsa.pub：公開金鑰（public key）: 要放在遠端的 Linux 伺服器上。\n\nid_rsa：私密金鑰（private key）: 自己保護好，等同於你的 Linux 密碼。\n\n先把自己本機 `id_rsa.pub` 傳到遠端的 Linux server 上，\n\n接著在 Linux 上執行以下指令\n\n( 把公開金鑰放到 `~/.ssh/authorized_keys` )\n\n```cmd\ncat id_rsa.pub \u003e\u003e ~/.ssh/authorized_keys\n```\n\n讓我們來測試看看吧 :smile:\n\n`ssh twtrubiks@192.168.56.101`\n\n![alt tag](https://i.imgur.com/97ndrP8.png)\n\n不用輸入密碼就可以登入了 :thumbsup:\n\n### 方法二\n\n也可以透過 `ssh-copy-id` 來完成,\n\n```cmd\nssh-copy-id -i ~/.ssh/id_rsa.pub twtrubiks@192.168.56.101\n```\n\n![alt tag](https://i.imgur.com/eR5TIJ3.png)\n\n其實不管是方法一還是方法二, 都只是把 key 加入 `/home/\u003cuser\u003e/.ssh`\n\n裡的 `authorized_keys` 而已 :smile:\n\n![alt tag](https://i.imgur.com/j4BRI1J.png)\n\n## root 使用者登入遠端 Linux\n\n注意, 通常不會這樣做 :exclamation:\n\n雖然這個方法可以比較危險，但我還是說明一下 :joy:\n\n先設定 root 密碼，執行以下指令\n\n```cmd\nsudo passwd root\n```\n![alt tag](https://i.imgur.com/dsSrBJX.png)\n\n再使用 `su -` 測試 root 密碼\n\n![alt tag](https://i.imgur.com/nmU9cgk.png)\n\n測試完成後，再執行 `ssh root@192.168.56.101`\n\n![alt tag](https://i.imgur.com/BF4JWnO.png)\n\n你會發現一直出現 Permission denied, please try again.\n\n這時候要到 Linux 上修改 root 的 ssh 設定，\n\n```cmd\nsudo vim /etc/ssh/sshd_config\n```\n\n找到 PermitRootLogin without-password\n\n![alt tag](https://i.imgur.com/NO85xui.png)\n\n修改成 PermitRootLogin yes\n\n![alt tag](https://i.imgur.com/xpyfpwW.png)\n\n最後記得一定要重新啟動 sshd 讓它生效 (或是重開機)\n\n```cmd\nsystemctl restart sshd\n```\n\n成功使用 root 登入了 :satisfied:\n\n![alt tag](https://i.imgur.com/Au4wt32.png)\n\n## 正確保護 server\n\n比較安全的作法通常是關閉 `PermitRootLogin` 以及 `PasswordAuthentication`,\n\n然後只啟用 `PubkeyAuthentication` 的方式, 但這邊要注意, 一定要把你的 key 放到\n\nserver 上, 否則如果設定完不小心退出, 就很麻煩 :expressionless:\n\n( 因為不能用密碼登入, 又忘記將 key 放到 server 中 )\n\n修改\n\n```cmd\nsudo vim /etc/ssh/sshd_config\n```\n\n禁止 root 登入, 將 `PermitRootLogin` 設為 `no`,\n\n![alt tag](https://i.imgur.com/W6KBiXS.png)\n\n禁止使用 password 登入, 將 `PasswordAuthentication` 設為 `no`,\n\n![alt tag](https://i.imgur.com/L9WPRq5.png)\n\n允許 `PubkeyAuthentication`, 設為 `yes`\n\n![alt tag](https://i.imgur.com/iYyaAQ8.png)\n\n補充, 還有一種是使用 PAM Authentication `UsePAM` ( AWS 就是使用這種方式 )\n\n![alt tag](https://i.imgur.com/g3MdnKC.png)\n\n如同說明, 如果希望只使用 PAM Authentication, 也可以把 `ChallengeResponseAuthentication` 設為 `no`.\n\n最後記得重新啟動 sshd 讓它生效 (或是重開機)\n\n```cmd\nsystemctl restart sshd\n```\n\n## 設定 `/etc/hosts`\n\n```cmd\nsudo vim /etc/hosts\n```\n\n以下內容代表, 在你的本機 `twtrubiks.com` 等於 `127.0.0.1`,\n\n可以依照自己的需求調整\n\n```cmd\n127.0.0.1     localhost\n127.0.1.1     twtrubiks.com\n```\n\n## 桌面環境 wayland or x11\n\n輸入以下的指令即可查看,\n\nx11 是舊的, 但和軟體相容度比較高\n\n( Kubuntu 22.04 預設就是 x11 )\n\n```cmd\n❯ echo $XDG_SESSION_TYPE\nx11\n```\n\nwayland 是比較新的, 但和軟體相容度比較低\n\n( debian 12 KDE 預設桌面環境 )\n\n```cmd\n❯ echo $XDG_SESSION_TYPE\nwayland\n```\n\n如果你是 wayland 請再安裝 pipewire\n\n```cmd\nsudo apt install pipewire\n\nsystemctl --user start pipewire\n```\n\n不然你會發現無法錄影, 以及分享螢幕.\n\n## 藍芽連線\n\n如果你無法使用藍芽 (debian12), 一直連線配對不上,\n\n請安裝以下, 重開機就可以了.\n\n```cmd\nsudo apt install pipewire-audio\n```\n\n## 其他資訊\n\n系統訊息\n\n```cmd\nuname -a\n```\n\n查看 cpu\n\n```cmd\ncat /proc/cpuinfo\n```\n\n查看全部的 ram 大小\n\n```cmd\ngrep MemTotal /proc/meminfo\n```\n\n查看可用的 ram\n\n```cmd\ngrep MemFree /proc/meminfo\n```\n\n也可以使用\n\n```cmd\nfree -m\n```\n\n查看硬碟空間 ( disk free space, Human Readable )\n\n```cmd\ndf -h\n```\n\n所有硬碟的訊息 ( List Drives and Mounts )\n\n```cmd\nlsblk\n```\n\n顯示所有裝置設備的資訊 ,UUID\n\n```cmd\nblkid\n```\n\n![alt tag](https://i.imgur.com/8a6V7fq.png)\n\n目前硬碟 mount 狀態 (開機自動掛載)\n\n```cmd\ncat /etc/fstab\n```\n\n![alt tag](https://i.imgur.com/79WxI5w.png)\n\n查看所有 pci\n\n```cmd\nlspci\n```\n\n查看所有 usb\n\n```cmd\nlsusb\n```\n\n也可以搭配 grep 搜尋，只搜尋包含 VirtualBox 的內容\n\n```cmd\nlsusb | grep VirtualBox\n```\n\n查看 ip\n\n```cmd\nip a\n```\n\nexternal ip Address ( 對外的 ip )，`ifconfig.me` 是一個網站，\n\n```cmd\ncurl ifconfig.me\n```\n\n查看電腦目前資訊，CPU RAM 等等\n\n```cmd\ntop\n```\n\n推薦 `htop` ( 資訊更清楚 ), 建議參考 [htop-tutorial](https://github.com/twtrubiks/linux-note/tree/master/htop-tutorial) - htop tutorial :thumbsup:\n\n透過 xrandr 修改螢幕的亮度，\n\n💢 如果你是使用 wayland, 這個工具是無法生效的, 必須使用 x11,\n\n暫時找不到替代軟體 😞\n\n先查看螢幕的 name\n\n```cmd\nxrandr | grep \" connected\" | cut -f1 -d \" \"\n```\n\n設定亮度 ( 0 - 1 )\n\n```cmd\nxrandr --output DP-1 --brightness 0.7\n```\n\n透過 systemd-analyze 查看 Linux 啟動時間\n\n```cmd\nsystemd-analyze\n```\n\n查看細節\n\n```cmd\nsystemd-analyze blame\n```\n\n如果今天想查看這個系統裝在這台電腦多久了,\n\n可使用以下的指令, 因為這個資料夾很少會去改動,\n\n所以可以參考這個的修改時間\n\n```cmd\nstat /lost+found/\n```\n\n### 關機重啟指令\n\n指令說明可使用以下指令查看\n\n```cmd\nshutdown --help\n```\n\n![alt tag](https://i.imgur.com/lDXENf0.png)\n\n直接關機\n\n```cmd\nshutdown -h now\n```\n\n指定時間關機\n\n```cmd\nshutdown -h 22:30\n```\n\n![alt tag](https://i.imgur.com/CE9p1gt.png)\n\n取消關機 (例如指定時間後想要取消, 如上圖)\n\n```cmd\nshutdown -c\n```\n\n模擬關機 (可以用來確認是否設定正確)\n\n```cmd\nshutdown -k 9:30\n```\n\n重開機\n\n```cmd\nreboot\n```\n\n查看關機紀錄\n\n```cmd\nlast -x shutdown\n```\n\n查看重開機紀錄\n\n```cmd\nlast -x reboot\n```\n\n系統開機時間\n\n```cmd\nuptime -s\n```\n\nlast system boot time\n\n```cmd\nwho -b\n```\n\n### 如何進入 tty 介面\n\n有時候開機時可能因為驅動沒裝, 導致卡在黑屏的畫面,\n\n這時候就可以進入 tty 介面安裝驅動(需要的東西),\n\n進入 tty 快捷建 `Ctrl+Alt+F2`\n\n退出 tty 快捷建 `Ctrl+Alt+F7` 或 `Ctrl+Alt+(F2/F3/F4)`\n\n### swap\n\n如果你的本機 ram 夠大, 可以考慮把它關掉,\n\n(有些 distro 預設是打開的 )\n\n關閉 swap\n\n```cmd\nsudo swapoff -a\n```\n\n打開 swap\n\n```cmd\nsudo swapon -a\n```\n\n以下指令可以幫你找出哪些程式用了多少 swap\n\n```cmd\n(echo \"COMM PID SWAP\"; for file in /proc/*/status ; do awk '/^Pid|VmSwap|Name/{printf $2 \" \" $3}END{ print \"\"}' $file; done | grep kB | grep -wv \"0 kB\" | sort -k 3 -n -r) | column -t\n```\n\n![alt tag](https://i.imgur.com/uibxLSu.png)\n\n## install packages\n\ninstall\n\n```cmd\nsudo apt-get install xxx\n```\n\n如果只有 `.deb` 檔案, 可以使用以下的方式\n\n```cmd\nsudo apt install ./xxx.deb\n```\n\n選擇可安裝的版本(例如 firefox)\n\n```cmd\nsudo apt-cache policy firefox\n```\n\n安裝指定的版本(例如 firefox)\n\n```cmd\nsudo apt install firefox=VERSION\n```\n\n鎖定版本(關閉自動更新),\n\n可使用以下的指令(例如 firefox)\n\n```cmd\nsudo apt-mark hold firefox\n```\n\n雖然你執行 `sudo apt-get update` 還是會看到有更新的版本, 但是它會跳過更新,\n\n範例如下, 會自動跳過.\n\n```cmd\n❯ sudo apt upgrade -y\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\nCalculating upgrade... Done\nThe following packages have been kept back:\n  firefox-esr\n```\n\n查詢已停用自動更新的套件\n\n```cmd\n❯ sudo apt-mark showhold\nfirefox-esr\n```\n\n假設今天想還原, 可使用指下指令 (例如 firefox)\n\n```cmd\nsudo apt-mark unhold firefox-esr\n```\n\nupdate list ( 更新 packages 的最新資訊及列表 )\n\n```cmd\nsudo apt-get update\n```\n\n軟體來源會被放在 `/etc/apt/sources.list.d` 這個路徑底下.\n\nupgrade ( 更新軟體到最新的版本 )\n\n```cmd\nsudo apt-get upgrade\n```\n\n只更新特定的軟體, 舉例 vivaldi,\n\n先更新再安裝就是更新軟體的意思,\n\n```cmd\nsudo apt update \u0026\u0026 sudo apt install vivaldi-stable\n```\n\nremove\n\n```cmd\nsudo apt-get --purge autoremove xxxx\n```\n\n清理不需要的 packages ( `.deb` )\n\n```cmd\nsudo apt autoclean\n```\n\n清除不需要的依賴\n\n```cmd\nsudo apt autoremove\n```\n\n## ppa add/remove\n\nadd\n\n```cmd\nsudo apt-add-repository ppa:xxxx\nsudo apt update\n```\n\nremove\n\n```cmd\nsudo add-apt-repository -r ppa:xxxx\nsudo apt update\n```\n\n## 無法進入 bios\n\n```cmd\nsudo vim /etc/default/grub\n```\n\n你應該會看到類似的畫面\n\n```text\nGRUB_DEFAULT=\"0\"\nGRUB_TIMEOUT_STYLE=\"hidden\"\nGRUB_TIMEOUT=10   \u003c\u003c\u003c\u003c\u003c\u003c\nGRUB_DISTRIBUTOR=\"`lsb_release -i -s 2\u003e /dev/null || echo Debian`\"\nGRUB_CMDLINE_LINUX_DEFAULT=\"quiet splash usbcore.autosuspend=-1\"\nGRUB_CMDLINE_LINUX=\"\"\n```\n\n將 GRUB_TIMEOUT 的時間改長一點, 因為有可能是太快了, 導致來不及按🤣\n\n也請記得要再執行以下的指令更新\n\n```cmd\nsudo update-grub\n```\n\n## 跳過 grub 導引\n\n```cmd\nsudo vim /etc/default/grub\n```\n\n設定 GRUB_TIMEOUT 為 0, 就可以跳過 grub 導引.\n\n也請記得要再執行以下的指令更新\n\n```cmd\nsudo update-grub\n```\n\n## remove snap\n\n在 ubuntu 中, 預設會幫你安裝 snap, 我自己非常不喜歡,\n\n因為他是私人公司為維護的 :smile:\n\n以下附上移除 snap 指令,\n\n先使用 `snap list` 查看全部安裝的套件,\n\n然後一個一個使用 `sudo snap remove --purge firefox` 移除,\n\n全部移除完之後, 再整個移除 snap\n\n```cmd\nsudo apt remove --purge snapd\n```\n\n也刪除相關的資料夾 `rm -rf ~/snap`,\n\n避免安裝其他套件 snap 又被安裝回來, 請執行以下的指令\n\n```cmd\nsudo cat \u003c\u003cEOF | sudo tee /etc/apt/preferences.d/nosnap.pref\nPackage: snapd\nPin: release a=*\nPin-Priority: -10\nEOF\n```\n\n加入 firefox PPA, 以及從 apt 安裝 firefox\n\n```cmd\nsudo add-apt-repository ppa:mozillateam/ppa\nsudo apt update \u0026\u0026 sudo apt install firefox\n```\n\n## Linux 檔案系統(結構)\n\n[Linux-File-System/Structure](https://github.com/twtrubiks/linux-note/tree/master/linux-file-system-structure)\n\n## 更多文章\n\n[zsh-tmux-tutorual](https://github.com/twtrubiks/linux-note/tree/master/zsh-tmux-tutorual) - 超好用 zsh 以及 tmux。\n\n[zsh-powerlevel10k-tutorual](https://github.com/twtrubiks/linux-note/tree/master/zsh-powerlevel10k-tutorual) - zsh 搭配 Powerlevel10k, 超漂亮 terminal。\n\n[vim-shortcuts](https://github.com/twtrubiks/linux-note/tree/master/vim-shortcuts) - 紀錄 vim 快捷鍵\n\n[imwheel-tutorual](https://github.com/twtrubiks/linux-note/tree/master/imwheel-tutorual) - 改善 linux 滑鼠滾動問題。\n\n[shutter-tutorual](https://github.com/twtrubiks/linux-note/tree/master/shutter-tutorual) - Shutter is an excellent image capture tool.\n\n[systemctl-tutorial](https://github.com/twtrubiks/linux-note/tree/master/systemctl-tutorial) - systemctl 命令是系統服務管理指令\n\n[crontab-tutorual](https://github.com/twtrubiks/linux-note/tree/master/crontab-tutorual) - Linux Crontab\n\n[mount-disks-at-system-startup-on-ubuntu](https://github.com/twtrubiks/linux-note/tree/master/mount-disks-at-system-startup-on-ubuntu)\n\n[chinese-input-methods-on-ubuntu](https://github.com/twtrubiks/linux-note/tree/master/chinese-input-methods-on-ubuntu) - ubuntu 如何安裝中文輸入法\n\n[linux-install-locale](https://github.com/twtrubiks/linux-note/tree/master/linux-install-locale) - Linux 安裝中文介面(locale)\n\n[hime-tutorial](https://github.com/twtrubiks/linux-note/tree/master/hime-tutorial) - Linux 中更像微軟更好用的中文輸入法 hime\n\n[gnome-tweaks](https://github.com/twtrubiks/linux-note/tree/master/gnome-tweaks) - Ubuntu 安裝 GNOME Tweak tool\n\n[htop-tutorial](https://github.com/twtrubiks/linux-note/tree/master/htop-tutorial) - htop tutorial :thumbsup:\n\n[neofetch-tutorial](https://github.com/twtrubiks/linux-note/tree/master/neofetch-tutorial) - command-line system information tool :thumbsup:\n\n[copyq-tutorial](https://github.com/twtrubiks/linux-note/tree/master/copyq-tutorial) - 剪貼簿 :thumbsup:\n\n[tldr-tutorial](https://github.com/twtrubiks/linux-note/tree/master/tldr-tutorial) - 更好用更簡單的 man pages\n\n[krusader-tutorial](https://github.com/twtrubiks/linux-note/tree/master/krusader-tutorial) - file manager\n\n[fail2ban-tutorial](https://github.com/twtrubiks/linux-note/tree/master/fail2ban-tutorial) - 讓 server 更安全 :smile:\n\n[server 相關安全設定](https://github.com/twtrubiks/linux-note/tree/master/server-set-secure)\n\n[how-to-change-login-lock-background-ubuntu](https://github.com/twtrubiks/linux-note/tree/master/how-to-change-login-lock-background-ubuntu) - 修改Ubuntu 登入/鎖屏時的背景\n\n[grub-customizer-tutorial](https://github.com/twtrubiks/linux-note/tree/master/grub-customizer-tutorial) - 安裝 grub-customizer\n\n[enable-ubuntu-remote-tutorial](https://github.com/twtrubiks/linux-note/tree/master/enable-ubuntu-remote-tutorial) - 如何在 ubuntu 啟用遠端桌面\n\n[linux-nfs-server](https://github.com/twtrubiks/linux-note/tree/master/linux-nfs-server) - 如何在 ubuntu 啟用 NFS Server\n\n[apache-bench-tutorial](https://github.com/twtrubiks/linux-note/tree/master/apache-bench-tutorial) - Apache Bench (ab) 教學, 測試 server 效能工具.\n\n[subfinder-tutorial](https://github.com/twtrubiks/linux-note/tree/master/subfinder-tutorial) - subfinder 找出全部的子網域\n\n## 狀況排除\n\n[fix_could_not_get_lock_dpkg_ubuntu](https://github.com/twtrubiks/linux-note/tree/master/fix_could_not_get_lock_dpkg_ubuntu) - 修正 `E: Could not get lock /var/lib/dpkg/lock` Error\n\n[fix_network_manager_bug_ubuntu_18_04](https://github.com/twtrubiks/linux-note/tree/master/fix_network_manager_bug_ubuntu_18_04) - 修正 ubuntu 18.04 網路連線設定遺失問題.\n\n## 其他\n\n[Windows -\u003e Linux 優缺點](https://github.com/twtrubiks/linux-note/tree/master/linux-is-better-than-windows) - Windows -\u003e Linux 優缺點\n\n[ubuntu-18-04-on-Lenovo-X1-Carbon-6](https://github.com/twtrubiks/linux-note/tree/master/ubuntu-18-04-on-Lenovo-X1-Carbon-6)\n\n[透過 VirtualBox 安裝 Ubuntu 19.10 （以及一些個人想法）](https://youtu.be/lI1EMwhW6lE)\n\n[VirtualBox 6.1 Linux 安裝 Guest Addition - 全屏教學](https://youtu.be/PMw6FPtbbaU)\n\n[alternative-software](https://github.com/twtrubiks/linux-note/tree/master/alternative-software) - windows -\u003e Linux 替代軟體\n\n[rclone-tutorial](https://github.com/twtrubiks/linux-note/tree/master/rclone-tutorial) - rclone 是一套很棒的文件同步管理工具\n\n[stacer-tutorial](https://github.com/twtrubiks/linux-note/tree/master/stacer-tutorial) - Linux System Optimizer and Monitoring\n\n[cmatrix-tutorial](https://github.com/twtrubiks/linux-note/tree/master/cmatrix-tutorial) - 超酷又超沒用的 cmatrix\n\n[sl-tutorial](https://github.com/twtrubiks/linux-note/tree/master/sl-tutorial) - sl 火車開起來\n\n[linux-tlp-tutorial](https://github.com/twtrubiks/linux-note/tree/master/linux-tlp-tutorial) - Linux Advanced Power Management\n\n[speedtest-cli-tutorial](https://github.com/twtrubiks/linux-note/tree/master/speedtest-cli-tutorial) - Linux speedtest-cli tutorial\n\n[gnirehtet-tutorial-tutorial](https://github.com/twtrubiks/linux-note/tree/master/gnirehtet-tutorial) - 透過電腦讓手機上網\n\n[scrcpy-tutorial-tutorial](https://github.com/twtrubiks/linux-note/tree/master/scrcpy-tutorial) - 使用電腦控制手機\n\n[variety-tutorual](https://github.com/twtrubiks/linux-note/tree/master/variety-tutorual) - variety 自動更換桌面\n\n[arandr-tutorual](https://github.com/twtrubiks/linux-note/tree/master/arandr-tutorual) - arandr 設定多螢幕工具\n\n[inotify-tools-tutorial](https://github.com/twtrubiks/linux-note/tree/master/inotify-tools-tutorial) - inotify-tools 監控檔案變動 inotifywait\n\n[ssh-tunneling-tutorial](https://github.com/twtrubiks/linux-note/tree/master/ssh-tunneling-tutorial) - SSH Tunneling 教學\n\n[linux-virtualbox-ssh-tutorial](https://github.com/twtrubiks/linux-note/tree/master/linux-virtualbox-ssh-tutorial) - 在 Linux 中設定 VirtualBox 把玩 ssh\n\n[linux-virtualbox-problem](https://github.com/twtrubiks/linux-note/tree/master/linux-virtualbox-problem) - 在 Linux 中設定 VirtualBox - 常見問題\n\n[QEMU-KVM-tutorial](https://github.com/twtrubiks/linux-note/tree/master/QEMU-KVM-tutorial) - QEMU-KVM (效能速度比 virtualbox 更好)\n\n[smartmontools-tutorial](https://github.com/twtrubiks/linux-note/tree/master/smartmontools-tutorial) - smartmontools 教學\n\n[hdparm-tutorial](https://github.com/twtrubiks/linux-note/tree/master/hdparm-tutorial) - hdparm 教學\n\n[fstrim-ssd-tutorial](https://github.com/twtrubiks/linux-note/tree/master/fstrim-ssd-tutorial) - fstrim ssd 教學\n\n[exFAT-usb-tutorial](https://github.com/twtrubiks/linux-note/tree/master/exFAT-usb-tutorial) - 讓usb可以存放大於4GB檔案 教學\n\n[Linux 桌面環境 Desktop Environment](https://github.com/twtrubiks/linux-note/tree/master/linux-de)\n\n[認識 Linux 發行版 distribution](https://github.com/twtrubiks/linux-note/tree/master/linux-distro)\n\n[KDE setting](https://github.com/twtrubiks/linux-note/tree/master/kde-settings)\n\n## Reference\n\n* [Linux Command 命令列指令與基本操作入門教學](https://blog.techbridge.cc/2017/12/23/linux-commnd-line-tutorial/)\n\n## Donation\n\n文章都是我自己研究內化後原創，如果有幫助到您，也想鼓勵我的話，歡迎請我喝一杯咖啡 :laughing:\n\n綠界科技ECPAY ( 不需註冊會員 )\n\n![alt tag](https://payment.ecpay.com.tw/Upload/QRCode/201906/QRCode_672351b8-5ab3-42dd-9c7c-c24c3e6a10a0.png)\n\n[贊助者付款](http://bit.ly/2F7Jrha)\n\n歐付寶 ( 需註冊會員 )\n\n![alt tag](https://i.imgur.com/LRct9xa.png)\n\n[贊助者付款](https://payment.opay.tw/Broadcaster/Donate/9E47FDEF85ABE383A0F5FC6A218606F8)\n\n## 贊助名單\n\n[贊助名單](https://github.com/twtrubiks/Thank-you-for-donate)\n\n## License\n\nMIT license\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Flinux-note","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwtrubiks%2Flinux-note","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Flinux-note/lists"}