# Linux 系統生存課 ###### tags: `cosbi` Linux 指的是 [**Linux Kernel**](https://github.com/torvalds/linux) 作業系統核心,只包含系統層級的基礎元件/功能,而我們使用電腦系統必須還要有 UI(使用者介面)和一些管理程式等等。Linux distributions 則是基於 Linux Kernel 開發的作業系統,不同的 distributions 會預載不同的使用者軟體。 [10 Top Most Popular Linux Distributions of 2021](https://www.tecmint.com/top-most-popular-linux-distributions/), 這是 [TecMint](https://www.tecmint.com/) 2021 年統計的受歡迎 Linux distributions 排行榜。我自己有用過 Keli, CentOS, Ubuntu, Fedora,一般新手我推薦使用基於 [RHEL](https://zh.wikipedia.org/wiki/Red_Hat_Enterprise_Linux) 發展的 [CentOS](https://zh.wikipedia.org/zh-tw/CentOS) 和基於 [Debian](https://zh.wikipedia.org/zh-tw/Debian) 發展的 [Ubuntu](https://zh.wikipedia.org/zh-tw/Ubuntu),前者使用 yum 後者使用 apt 進行軟體套件管理。 ## 大綱 [ToC] ## 安裝 - 下載 [Ubuntu 20.04 Desktop](https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64) - 下載 [Rufus](https://rufus.ie/zh_TW/) 製作開機 USB - 選擇你的 USB 硬碟和上面下載的 .iso 映像檔案,其他保留預設就好 ![rufus](https://i.imgur.com/kAEEFUT.png =50%x) - 如果你要 Windows + Ubuntu 雙系統 需進行 [磁碟分割](https://www.asus.com/tw/support/FAQ/1044688/),想純粹安裝 Ubuntu 者略過 - 重開電腦狂點 Del 進入 bios 選擇 usb 開機 (每個電腦廠牌進入點選的按鈕和 bios 設定不同 可上網查) - 開始安裝 (只列出需要注意的步驟,其他沒列就做直觀的選擇就好 e.g. Continue) - 得安裝英文版的,中文版資料夾路徑會產生問題,輸入法也先選英文就好,保留預設值不動 ![](https://i.imgur.com/tARX2iR.png) - 如果要 Windows + Ubuntu 會看到 Install Ubuntu alongside Windows 10 的選項(得先安裝 Windows 再安裝 Ubuntu ) ![](https://i.imgur.com/qAQCQzv.png) ## 指令操作 - Linux 系統預設使用 `/bin/bash` 作為使用者登入 Shell - 不知道指令怎麼下參數的話可以加入 `--help` or `-h` 查詢 ### 基本 - 檔案操作: `ls`, `ll`, `cat`, `file`, `head`, `tail`, `rm`, `cp`, `stat` - 目錄操作: `cd`, `mkdir`, `rm -r`, `pwd`, `cp -r` - 列出 Command 歷史: `history` - 列出時間資訊: `date`, `timedatectl` - 自訂指令名稱: `alias` - 指令手冊: `man` ### 進階 - 檔案權限操作: `chmod`, `chown`, `chgrp` ![](https://i.imgur.com/eQwwlnx.png =50%x) - 壓縮/解壓縮: `zip`, `unzip`, `tar` - 查看磁碟: `lsblk`, `df -h` - 監控系統: `ps`, `htop`, `kill` - 輸入/輸出導向, 管線操作: `|`, `>`, `>>` - bash script - 排程任務: `cron` ## 軟體工具 在 Ubuntu 下 9.9 成軟體可以使用 apt 套件管理程式來安裝,原理是系統預設寫好每個軟體的來源(IP),當你下指令系統會去對應的網路來源下載軟體並安裝,因為是系統預設好的所以不同系統版本(Ubuntu 14.04 , 16.04, 18.04 ..etc)的預設來源可能不同,有些太新的軟體甚至沒有,這時候可以使用 `sudo apt update` 做來源更新,或是上網搜尋找安裝方法加入新的來源列表。 ### Python 使用 Linux 開發 Python 幾乎一定會用到的軟體工具 ```bash= sudo apt install -y git tree python3-pip python3-venv ``` ### Network ```bash= sudo apt install -y net-tools curl ``` 網路偵錯工具:`ping`, `netstat`, `traceroute`, `dig` ### Vim ![](https://i.imgur.com/KyoxsOV.png) ```bash= sudo apt install -y vim ``` **特色** - 高度客製化和擴充彈性 - 讓你 Coding 速度 **最快** **Multiple operating mode** - Normal - Insert - Replace - Visual - Command-line Cheat sheet: ![](https://i.imgur.com/TgsRyWm.png) Original Vim: ![](https://i.imgur.com/DD3Sph8.png =50%x) After configuration: ![](https://i.imgur.com/c7CqhBu.png) 可以使用我的設定檔: https://github.com/Msiciots/term-conf ### Tmux ```bash= sudo apt install -y tmux ``` - Client / Server model - Keep running while SSH disconnect - Share sessions between multi-user Tmux 主要用來分割 Terminal , 還有在多個 Terminal 間切換 ![](https://i.imgur.com/0fke4iB.png) 我寫 Code 幾乎都用這兩個工具,當然你也可以用 [VSCode](https://code.visualstudio.com/) ## 創建 Django 網站 建立 Python 虛擬環境,可在任意資料夾下創建 ```bash= python3 -m venv djenv ``` 啟用虛擬環境,已經進入虛擬環境後執行指令用 python3, python 都可以 ```bash= source ./djenv/bin/activate ``` 安裝 Django 還有任何你網站會用到的 Python 套件 ```bash= pip install Django ``` **創建 Django project** (跟暑假上課教的一樣,稍微提到) ```bash= django-admin startporject web_project cd ./web_project python manage.py startapp mainPage ``` **執行網站** ```bash= python manage.py runserver ``` 離開虛擬環境 ```bash= deactivate ``` 刪除虛擬環境,直接刪除虛擬環境資料夾即可 ```bash= rm -rf ./djenv ``` ### 讓外部連線 一般創建完 Django project 可以直接使用 localhost:8000 在瀏覽器查看網站,但並不能讓其他電腦連線進來,得做特別設定。 查看目前電腦 IP, 下面輸出中的 `inet` 就是你的目前電腦IP,如果是 140.116 開頭可以直接讓別台電腦連線,如果像我是 192.168 開頭代表這是 **虛擬IP** 我的電腦上面有路由器存在,須做 **Port forwarding** 設定,這個設定是 case by case 我得透過實際操作才能教你 ```bash= ifconfig ## 以下為輸出 enp0s31f6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.3 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::39b4:6cf0:35c5:8b96 prefixlen 64 scopeid 0x20<link> ether 98:ee:cb:41:99:03 txqueuelen 1000 (Ethernet) RX packets 589357 bytes 392667026 (392.6 MB) RX errors 0 dropped 696 overruns 0 frame 0 TX packets 502163 bytes 99188643 (99.1 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 16 memory 0xdf000000-df020000 ``` 到 `settings.py` 設定能允取外部連線的IP位置 ```python= # 對所有電腦內網卡 IP 開放連線 ALLOWED_HOSTS = ['*'] ``` 在啟動時加入參數 ```bash= # 0.0.0.0 代表監聽所有本機上的網卡連線 python manage.py runserver 0.0.0.0:8000 ``` 當已經設定好後輸入你目前網域的 **Public IP**(140.116....)加上對應的 **Port** 就可以讓外部連線 假設我的 Public IP 是 140.116.214.151 那我在任何裝置的瀏覽器上輸入 http://140.116.214.151:8000 就能連到我的網站 ### Model 一般資料庫是使用 SQL 指令來存取資料,但在 Django 中是使用 Object Relational Mapping (ORM) 方式來存取資料。透過建立抽象化的 model ,將資料視為一種「物件」,就可以用 python 的方式來處理資料,而不用擔心底層的資料設定。 使用 model 時,我們必須先進入 models.py 中設計每個資料表的 class,再利用以下指令把虛擬層的 class 寫入真的資料庫 ( SQLite ) 中: ``` bash $ python manage.py makemigrations #產生 class 描述檔案,位置在 app/migrations 中 $ python manage.py migrate #根據描述檔來變更資料庫設定 ``` 如果要讓 Django 預設的 admin 介面能夠讀取資料庫 ( 實際上是讀取虛擬層的 model ),就必須另外在 admin.py 中啟用剛剛設計好的 model ( 請參考下個段落 )。 如果要讓 views.py 順利讀取資料庫,除了透過 SQL 語法,也可以直接透過 ORM 的方式來進行操作,例如: ``` python table1 = models.Table.objects.all() #取得此 Table 的全部資料 table2 = models.Table.objects.get(id='001') #取得此 Table 的某筆資料 table3 = models.Table.objects.filter(num<10) #篩選此 Table 的某些資料 ``` ### SQLite Django 預設使用的資料庫檔案系統, 有內建的後端程式會幫忙處理資料庫溝通,且內建一個管理介面 ( Django admin ),可以直接增加、刪除、搜尋資料。 #### Django admin 首先建立 superuesr,請打以下指令: ```bash=\ $ python manage.py migrate #之前如果沒做過,記得加上這行 $ python manage.py createsuperuser #在db中創建管理員帳號 ``` 按照步驟設定完帳密後,確認 urls.py 中應該有預設好路徑: ```python= urlpatterns = [ path('admin/', admin.site.urls), #<-這個! ... ] ``` 接著登入你的網站,後面加上 admin 路徑(如 http://localhost:8000/admin/ ),即可登入資料庫管理頁面。可以遠端查看、新增、刪除資料,但是無法直接匯入資料表。 ![](https://i.imgur.com/O3kRBdc.png) 請注意,每在 models.py 中新增一個 class,就必須去你 APP 下的 admin.py 中讀入這個 class,才可以順利在管理介面看到你的資料,相關設定可以參考 [教學文件](https://developer.mozilla.org/zh-TW/docs/Learn/Server-side/Django/Admin_site)。 ```python= # admin.py from <your_app> import models class <your_admin_class>(admin.ModelAdmin): #客製化你的 admin 介面 list_display = ('',...) #要顯示的欄位 search_fields = ('',...) #能夠被搜尋的欄位 list_filter = ('',...) #很難用的 filter,只適合種類不多時 ordering = ('',...) #讓資料表用某個欄位預先排序 admin.site.register(models.<your_class>,<your_admin_class>) #這行一定要寫才能抓你的 model class,如果資料表很多的話可以改用 decorator 的方式 ``` 另外,網站實際上線到工作站的 Apache 上時,會無法順利讀取 admin 介面的 css,這是因為 Apache 需要透過 wsgi 讀取你的 Django project,但是 settings.py 中預設只去讀取 static 中的檔案。解決辦法,可以將虛擬環境中的 Django 套件中的 static 路徑找出來,丟進去你 project 的 static。 路徑一般會在 django/contrib/admin/static 中,如果不知道你的 Django 套件路徑在哪,請輸入以下指令: ```bash $ python -c "import django; print(django.__path__)" ``` #### 匯入資料表 匯入資料表有幾種方式,第一是不使用資料庫,直接透過 pandas 來讀取資料;第二是使用第三方應用程式,例如 [DB Browser](https://sqlitebrowser.org/) 圖形化介面來存取資料庫;第三是利用 sqlite3 來下 SQL 指令。 #### [DB Browser](https://sqlitebrowser.org/) 方法 因為 CSV 本身沒有 data type 的描述,只有用 comma 來區分資料,所以如果直接用 DB Browser 來讀取,預設都會是 string。如果格式偵測失敗,就需要另外修改資料格式。 直接在 Database Structure 按下資料表,選擇 Modify Table,就可以修改特定 field 的名稱與格式。 ![](https://i.imgur.com/GNBFqPN.png) ![](https://i.imgur.com/tSa4R95.png) 請注意,如果要將資料表給 Django 使用,必須設定 primary key 。只要選擇任一個 unique 欄位( 或自己創建 index ),將 PK 欄位打勾就行。 ![](https://i.imgur.com/Lgnr5XY.png) 匯入資料表後,如果要在 Django 使用 ORM 語法,我們還必須將欄位寫入 models.py 中。可以直接利用以下指令來自動完成 model: ```bash $ python manage.py inspectdb > <your_app>/models.py ``` **注意:** 有人反應 inspectdb 會讀取資料格式失敗,特別是發生在 primary key 上。請在執行 inspectdb 後自己檢查一下所有 models.py 的設定都正確。 **補充:** 如果不自行設定 primary key,Django 會在某些 ORM 操作中失敗。可以透過 makemigrations、migrate 來產生資料庫設定檔,Django 會自己創一個欄位 id 作為 primary key。 #### [sqlite3](https://www.sqlite.org/cli.html) 方法 如果只想在 local 端匯入與設定資料庫,DB Browser 就夠用了。但如果要遠端連線,就必須另外學如何使用 SQL 指令。 - 安裝 sqlite3, ubuntu 下的 sqlite 管理程式, [sqlite3 官方說明文件](https://www.sqlite.org/cli.html) ```bash sudo apt install sqlite3 ``` 操作方式, 匯入 csv 表格 ```bash sqlite3 ./db.sqlite3 ### 已進入 sqlite shell ### 可以直接匯入 .csv 但是所有欄位資料格式會是 TEXT sqlite> .mode csv sqlite> .import ./domain_map_id.csv domain_map_id ### 先建立 Table 再匯入, 可自訂欄位資料型態 sqlite> CREATE TABLE domain_map_id( "domain_name" TEXT, "count" INTEGER, "systematic_name" TEXT, "domain_source" TEXT, "domain_description" TEXT, "interpro_id" TEXT ); sqlite> .mode csv sqlite> .import ./domain_map_id.csv domain_map_id # 列出所有 table sqlite> .tables # 查看 table 內容 sqlite> select * from table_name; # 查看 table 欄位 sqlite> .schema table_name # 刪除 table sqlite> drop table table_name; ``` - sqlite3 原生沒有支援改動欄位資料型態的指令,請參考 [ALTER TABLE Statement](https://www.techonthenet.com/sqlite/tables/alter_table.php) #### [sqlite-web](https://github.com/coleifer/sqlite-web) 方法 可以透過網頁方式 GUI 介面管理 SQLite 資料庫 使用方式: ```bash= sqlite_web /path/to/database.db ``` 從本機端電腦建立 SSH Local Port Forwarding 連線到遠端電腦上 ```bash= ssh -L 8080:127.0.0.1:8080 cosbi20@140.116.214.151 -N ``` 可以新建表格, 先自行添加欄位名稱和資料型態, 然後 import csv ![](https://i.imgur.com/kP56gZ5.png) 我通常只用來瀏覽資料頁面, 匯入資料表推薦用 `sqlite3` ![](https://i.imgur.com/kuZ7z45.png) :::danger 建議大家不要用開放外部電腦連線進來的方式, 怕 SQLite 資料庫內容被亂搞 ::: ### MySQL 在網站跟資料庫都在同一台電腦上的情況,我建議用 Django 預設的 SQLite 就好,它是 local 端的資料庫檔案,內建在專案目錄底下 `db.sqlite3`。因為我們實驗室傳統用 MySQL,我特別講一下在自己電腦上該怎麼建立,如果要用 SQLite 的話可以自己去查教學,比 MySQL 步驟簡單很多。 在你的電腦安裝 MySQL ```bash= sudo apt install -y mysql-server ``` 安裝 MySQL 跟 Python 溝通用的工具 ```bash= sudo apt-get install -y python3-dev default-libmysqlclient-dev build-essential ``` 在你的 Django 環境裡安裝 MySQL 連線工具 ```bash= pip install mysqlclient ``` #### 創建 MySQL 使用者,資料庫,匯入資料表 進入 mysql shell ```bash= sudo mysql -u root ``` 創建使用者 ```bash= CREATE USER 'username'@'localhost' IDENTIFIED BY 'yourpassword'; ``` 建立 Database ```bash= CREATE DATABASE my_db; # 查看 show databases; ``` 授予使用者存取資料庫權限 ```bash= GRANT ALL PRIVILEGES ON my_db.* TO 'username'@'localhost'; ``` 匯入資料表格,要懂每個參數的意義不然很容易出錯 ```bash= USE my_db; # 先創建一個 table 欄位需要特別設定 CREATE TABLE table_name ( id INT NOT NULL AUTO_INCREMENT, column_1 VARCHAR(255) NOT NULL, column_2 DATE NOT NULL, column_3 DECIMAL(10 , 2 ) NULL, column_4 INTEGER, PRIMARY KEY (id) ); # 匯入資料表檔案到上面創建的 table 中 LOAD DATA INFILE '/home/cosbi/export_file.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '/n' IGNORE 1 ROWS; # 查看資料表內容 SELECT * FROM table_name; ``` 到 `settings.py` 加入 Database 設定 ```python= DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'my_db', 'USER': 'username', 'PASSWORD': 'yourpassword', 'HOST': 'localhost', # Or an IP Address that your DB is hosted on 'PORT': '3306', } } ``` 匯入 MySQL 資料庫內容到 django models ```bash= python manage.py inspectdb > ./mainPage/models.py ``` 這樣終於可以透過 Django 的 model 操作資料庫了 :upside_down_face: ##### phpMyAdmin 可以讓你在網頁上透過圖形操作管理 MySQL 資料庫,上面教學是透過 MySQL command shell 操作 安裝教學: https://www.javahelps.com/2018/10/install-mysql-with-phpmyadmin-on-ubuntu.html ## SSH 連線 讓你在任何電腦都可以透過 Terminal 連線進你的實驗室電腦(在家連回實驗室好用) - 設定跟 [讓外部連線](###讓外部連線) 一樣,得取得電腦 **Public IP** 還有 **Port** 對應 - SSH 的預設 port 是 22, 假設電腦上曾有 Router 必須設定對應到電腦的 port 22 - 這時候就看到 Tmux + Vim 的強大了,可以直接用 Terminal coding 和多種操作,不需要在其他電腦特別安裝文字編輯器,不會被裝置限制 安裝 SSH Server ```bash= sudo apt install -y openssh-server ``` 連線方式(在其他電腦上) ```bash= ssh username@140.116.214.151 ``` ### [FileZilla](https://filezilla-project.org/) 讓你在別台電腦存取實驗室電腦上檔案,跟暑假課程連實驗室 Server 方式一樣 - 連線方式記得選 sftp ### [VSCode Remote SSH](https://code.visualstudio.com/docs/remote/ssh) 你可能還是覺得 Vim 用起來超卡,違反人類直覺。其實 VSCode 也能透過遠端連線編輯別台電腦上的檔案,同步檔案內容。連結在標題裡了,直接安裝就好。 ## Jupyter Jupyter notebook/lab 應用在資料處理上非常方便, 有很好的視覺化和執行部份程式碼 Debug 功能 Python 安裝: ```bash= # 安裝 jupyter lab pip install jupyterlab # 安裝 jupyter notebook pip install notebook ``` 直接到想要開啟的資料夾下命令`jupyter`就開啟了 jupyter server, 如果要遠端連線的話必須透過 SSH Local Port Forwarding 從遠端電腦下指令,把本機的 port 8888 跟遠端電腦的 port 8888 建立加密連線通道: ```bash= ssh -L 8888:127.0.0.1:8888 cosbi20@140.116.214.151 -N ``` :::danger 建議大家不要自己嘗試 jupyter server 的遠端 http 連線功能, 沒有經過加密連線電腦很容易被入侵 ::: ## 使用成大 SSL VPN 服務 老師要求每台電腦只開放成大網域連線(非成大網域無法連進實驗室電腦),在家要使用成大網域連線得透過 VPN https://cc.ncku.edu.tw/p/412-1002-7637.php?Lang=zh-tw 注意: 已在成大網域內無法使用 可用軟體登入, 也能用成大網頁登入 ![](https://i.imgur.com/L36BvxW.png =50%x) ![](https://i.imgur.com/bONuQjd.png) 檢查是否連線成功: ![](https://i.imgur.com/0MH1mbm.png =70%x) ## 設定防火牆 (建議在本機端執行) 防火牆是使用ubuntu內建的ufw,這個大家的ubuntu裡都有但應該都沒有啟動,所以先下指令啟動 ```bash= sudo ufw enable ``` 此時防火牆就會啟動,因為我是先啟動防火牆才安裝openssh,所以防火牆規則會自動加入,後啟動的不確定會發生什麼事,先看一下防火牆規則 ```bash= sudo ufw status verbose ``` 此時應該會看到類似這樣的畫面 ``` Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- 22 ALLOW IN Anywhere 22 (v6) ALLOW IN Anywhere (v6) ``` 22是ssh預設的port,如果沒有的話也沒關係,等等會重寫規則。 首先先設定預設連線,我們先預設拒絕所有的外部連線,輸入 ```bash= sudo ufw default deny ``` 再來設定port 22只允許校內網路登入,依序下指令 ```bash= #先允許校內ip可以連線到ssh port(22) sudo ufw allow from 140.116.0.1/16 to any port 22 #再來禁止所有對ssh port(22)的存取 sudo ufw deny 22 ``` 這樣如果使用校外網路登入就會沒有回應,再來要使用django開放別人進入網站的話需要開放http/https,所以輸入指令 ```bash= #先開http就好 sudo ufw allow http #https sudo ufw allow https ``` 如果都添加完成的話你的規則應該會像 ``` Status: active Logging: on (low) Default: deny (incoming), allow (outgoing), disabled (routed) New profiles: skip To Action From -- ------ ---- Anywhere ALLOW IN 140.116.0.0/16 22 ALLOW IN 140.116.0.0/16 80/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere 22/tcp DENY IN Anywhere 80/tcp (v6) ALLOW IN Anywhere (v6) 443/tcp (v6) ALLOW IN Anywhere (v6) 22/tcp (v6) DENY IN Anywhere (v6) ``` Port 80是http,port 443是https,要開放哪些port取決於你自己的軟體或服務,比如jupyter的預設port是8000或8888。 最後教一下刪除規則,假如有規則想要取消可以先透過指令來檢視規則的編號 ```bash= sudo ufw status numbered ``` 會看到防火牆的規則跟編號,例如: ``` To Action From -- ------ ---- [ 1] Anywhere ALLOW IN 140.116.0.0/16 [ 2] 22 ALLOW IN 140.116.0.0/16 ``` 此時在下刪除指令並輸入規則編號 ```bash= sudo ufw delete 2 ``` 刪除前會再確認一次你的規則,輸入y後就會刪除 ``` Deleting: allow from 140.116.0.0/16 to any port 22 Proceed with operation (y|n)? ``` 防火牆的設定大概就到這樣 ## WSL 使用 WSL (Windows Subsystem for Linux) 是 Windows 內建的簡易版 Linux,對於想練習 Linux 但又不想放棄 Windows 的人來說是個好選擇。 請用系統管理員身分開啟 cmd,輸入 `wsl.exe --install`,安裝完後重啟電腦,即可使用 WSL。 要使用 WSL,可以直接在 cmd 中輸入 `wsl` 來登入 Ubuntu,或是直接使用安裝好的 Ubuntu 應用程式(會是一個 Ubuntu Shell)。 在 WSL 中,你的 Windows 預設路徑會在 `/mnt/c/Users/<your_name>` ;在 Windows 中,你的 Ubuntu 路徑 **可能** 會在: ``` C:\Users\<your_name>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\<your_name> ``` 路徑有點長,建議把它存起來,這樣就可以直接在 Windows 上開發你的專案。 ### WSL 防火牆設定 在 WSL 中無法使用 ufw,你需要設定 Windows 的防火牆規則。 請在搜尋列中尋找「Windows Defender 防火牆」,按左邊的「進階設定」,打開「具有進階安全性的 Windows Defender 防火牆」。 點選「輸入規則」,再點選「新增規則」: ![](https://i.imgur.com/3Dqt95V.jpg) 點選「連接埠」 ![](https://i.imgur.com/FB9X7IO.png) 設定你的 Port(例如 Django 預設使用 8000) ![](https://i.imgur.com/OJFUB6O.png) 之後都按照預設,選「允許連線」,並全部套用規則,再自行命名這個規則的名稱即可。 這樣就會讓這個 Port 對外打開。如果要限定學校 IP,需要進一步作設定。 請找到剛剛的新規則,點進去後,選擇「領域」,在「遠端 IP 位址」輸入允許的 IP(例如:140.116.0.0/16),按下確定。 ![](https://i.imgur.com/ighKlJJ.png) 這樣就能順利擋下成大以外的 IP 。 **補充:** 如果你發現不論怎麼封鎖 IP,都還是擋不住,可能是防火牆中有其他規則覆蓋了你的設定。以我上面的例子,有一個規則叫 python3.8(我用來 runserver 的程式),它預設對外全部開啟,把它關閉後即可。 ## Ubuntu 缺點 - Libre Office 難用, 可能習慣了 PowerPoint - 沒有 Line , 可以裝 Chrome extension ## 網路資源 - [鳥哥私房菜 - Linux 基礎學習篇訓練教材](https://linux.vbird.org/linux_basic_train/centos8/)