Select Page
用 wpa_cli 控制你的 WIFI (無線網路)

用 wpa_cli 控制你的 WIFI (無線網路)

wpa_cli 是一個用於與 wpa_supplicant 交互的命令行界面工具,當然也支持在 command line 下直接使用命令控制 WIFI,可以用來管理無線網絡接口的設定和運行狀態。這個工具非常強大,支持多種操作,如掃描無線網絡、連接到網絡、變更設定等,而我都用python 透過 wpa_cli 來控制 WIFI。

首先掃描無線網路

打開終端,並且記得要用 root 權限來執行 wpa_cli

sudo wpa_cli -i wlan1 scan
sleep 5  # 給予一些時間來完成掃描
sudo wpa_cli -i wlan1 scan_results

回應如下圖

加一個網路配置

利用 ssid 和 paswword 來連線到一個已知的無線網路上,可以將下面的指令編寫成 wpa_cli_add_network.sh ,並且執行她,也可以直接使用,執行後取得的 network id 通常是一個 int 的數字,把她記起來,之後就可以透過這個 network id 來連接網路,和斷開網路

# 添加新的網絡配置
network_id=$(wpa_cli -i wlan1 add_network | awk '{print $NF}')

# 設置SSID和密碼
wpa_cli -i wlan1 set_network $network_id ssid '"你的SSID"'
wpa_cli -i wlan1 set_network $network_id psk '"你的密碼"'

# 啟用該網絡
wpa_cli -i wlan1 enable_network $network_id

# 保存配置
wpa_cli -i wlan1 save_config

連接網路以及斷開網路

# 重新連線
wpa_cli -i wlan1 reconnect

#斷開連線
wpa_cli -i wlan1 disconnect

刪除網路配置

wpa_cli -i wlan1 remove_network $network_id

檢查連線是否存在

wpa_cli -i wlan1 status

得到的輸出通常如下

其中,檢查是否有連線成功,可以看 wpa_state 是否為 COMPLETED

檢查已經存在的網路設定

sudo wpa_cli -i wlan1 list_networks

輸出如下

可以用 flags CURRENT 來檢查現在是連線到那一個 network ,也可以取得 network id ,並且用他來連線

清除 Nginx cache 的服務 – 使用NodeJS

如果你有用 Nginx 的快取服務,無論是 fastcgi or proxy cache,都會遇到很難有一套真正好用的清除工具,這邊示範一套自己開發的清除工具,也支援多伺服器使用

安裝必要的套件

你先需要有nodejs,沒有的人先去官網安裝下,安裝完畢的人,先建立一個目錄,並且輸入以下指令,安裝必要的套件

npm init -y
npm install express

建立一個 Node.js App

可以命名為 app.js,內容如下,會建立一個小型的伺服器,用來處理 http 的請求,並且刪除指定的目錄

const express = require('express');
const { exec } = require('child_process');
const fs = require('fs');

const app = express();
const PORT = 3000;

const logFile = 'application.log';

function log(message) {
    const timestamp = new Date().toISOString();
    fs.appendFileSync(logFile, `${timestamp} - ${message}\n`);
}

app.get('/delete-dir', (req, res) => {
    let dir = req.query.dir;

    if (!dir || /[^a-zA-Z0-9_\-\/]/.test(dir)) {
        log('提供的路徑不合法!');
        return res.status(400).send('提供的路徑不合法!');
    }

    const command = `sudo find /run/proxy_cache/${dir} -mindepth 1 -type d -exec rm -rf {} +`;

    exec(command, (error, stdout, stderr) => {
        if (error) {
            log(`执行错误: ${error}`);
            return res.status(500).send('删除子目錄失敗!');
        }
        log('子目錄删除成功!');
        res.send('子目錄删除成功!');
    });
});

app.listen(PORT, () => {
    log(`服务器正在运行于 http://localhost:${PORT}`);
});

其中我把能刪除的資料定義在只有這個目錄下的才行 /run/proxy_cache/ ,避免權限過大問題

配置 sudo 權限

打開 sudoers 文件

sudo visudo

加入指令,記得把 <username> 改成自己的名字,或是 www-data

<username> sudo find /run/proxy_cache/ -mindepth 1 -type d -exec rm -rf {} +

完成後的測試

可以利用 CURL 呼叫 API ,成功就會看到 “子目錄删除成功!” 的訊息

curl "http://localhost:3000/delete-dir?dir=cache_directory"

結論與注意事項

要記得別讓外部的人可以輕易地存取這項服務,防火牆要記得把port鎖好,執行權限要小心設定,這樣就可以搭配 Nginx Cache 使用,之後再來出對應的刪除功能。

開機時候自動執行

要讓 Node.js 應用在系統開機時由特定使用者(例如 www-data)啟動,需要配置一個 systemd 服務單元。在這個情況中,我們將創建一個服務單元文件來確保 Node.js 應用作為 www-data 使用者運行。

創建 systemd 服務文件

建立一個新的 systemd 服務文件。

sudo nano /etc/systemd/system/nodeapp.service

加入以下配置

[Unit] 
Description=Node.js Web Application 
After=network.target 

[Service] 
Type=simple 
User=www-data 
Group=www-data 
WorkingDirectory=/path/to/your/app 
ExecStart=/usr/bin/node /path/to/your/app/app.js 
Restart=on-failure 

[Install] 
WantedBy=multi-user.target

參數意思如下

Description: 服務的描述。

After: 這個單元應該在網絡服務可用之後啟動。

UserGroup: 指定運行此服務的使用者和組。

WorkingDirectory: 指定 Node.js 應用的工作目錄。

ExecStart: 指定啟動應用的命令。

Restart: 指定何時重新啟動服務,on-failure 表示只在程序異常退出時重啟。

啟用和啟動服務

重新加載 systemd 配置以讀取新的服務文件:

sudo systemctl daemon-reload

啟用剛創建的服務,使其在開機時自動啟動:

sudo systemctl enable nodeapp.service

啟動服務以檢查它是否運行正常:

sudo systemctl start nodeapp.service

檢查服務的狀態來確認一切正常:

sudo systemctl status nodeapp.service

讓 www-data 執行 SERVER 上的特定權限指令

sudoers 檔案控制了使用者及群組在使用 sudo 指令時的權限。為了安全編輯這個檔案,應該使用 visudo 指令,因為它會檢查語法錯誤,避免創建一個無法使用的 sudoers 檔案。

更新 sudoers 檔案的步驟:

開啟終端機

開啟你的伺服器的命令行介面。

使用 visudo 編輯 sudoers 檔案: 輸入以下指令以安全方式編輯 sudoers 檔案:

sudo visudo

新增規則

在編輯器中,新增一條規則,允許 www-data 使用者無需密碼執行特定指令。

www-data ALL=(ALL) NOPASSWD: /usr/bin/rm -rf /path/to/nginx/cache/*

指令的意義是:

www-data:指定的使用者。

ALL=(ALL):這表示 www-data 使用者可以從任何主機以任何使用者身份執行指令。

NOPASSWD:允許 www-data 使用者在執行指定的指令時不需要輸入密碼。

/usr/bin/rm -rf /path/to/nginx/cache/*:指定 www-data 使用者無密碼可以執行的指令。

儲存並退出編輯器

如果你使用的是 nano,按 Ctrl+X 來退出,然後按 Y 鍵儲存更改,最後按 Enter 鍵確認檔案名稱。

測試配置

為了確保設定正確無誤,可以用 www-data 份執行指令:

sudo -u www-data sudo /usr/bin/rm -rf /path/to/nginx/cache/*

如果不需要密碼且指令執行成功,代表 sudoers 檔案配置正確。

安全注意事項:

  • 最小權限原則:只授權必要的最小權限,避免給予 www-data 使用者太廣泛的權限。
  • 明確指令路徑:使用完整的指令路徑(如 /usr/bin/rm),避免安全風險。
  • 定期審計:定期檢查 sudoers 檔案,確保所有條目仍然符合組織的安全政策和操作需要。
最佳化你的 NFS 效能,讓檔案伺服器也會飛

最佳化你的 NFS 效能,讓檔案伺服器也會飛


調整NFS(Network File System)的效能可以從多個角度進行,包括調整NFS伺服器和客戶端的參數、網絡配置、以及文件系統的選擇。

調整 NFS 參數:

NFS Server 端

  • 使用 NFSv4: NFSv4 提供更好的效能和安全性。
  • 根據工作負載調整 rpc.mountd.port 和 rpc.nfsd.port 參數的值。
  • 調整 nfsd.minthreads 和 nfsd.maxthreads 參數的值,以優化執行緒數量。
  • 調整 nfs.readahead 和 nfs.writebehind 參數的值,以優化讀寫緩衝區大小。

範例如下

我的主機是 4VPU,4G RAM來設計

修改 /etc/nfs.conf 文件(或你系統中相對應的配置文件),設置最小執行緒數為 8,最大執行緒數為 64

調整邏輯,將 nfsd.minthreads 和 nfsd.maxthreads 參數設置為與 CPU 核心的數量相同或是略高一些

[nfsd]
threads=8 64

編輯 /etc/sysctl.conf

# NFS Setup
nfsd.minthreads =8
nfsd.maxthreads = 64
nfs.readahead = 65536
nfs.writebehind = 262144

重啟主機

sudo service nfs-kernel-server start

NFS Client 端

  • 使用 NFSv4: NFSv4 提供更好的效能和安全性。
  • 調整 mount.nfs.rsize 和 mount.nfs.wsize 參數的值,以優化讀寫緩衝區大小。
  • 調整 mount.nfs.mountd_port 和 mount.nfs.nfsd_port 參數的值。

調整邏輯,將 mount.nfs.rsize 和 mount.nfs.wsize 參數設置為與 TCP MTU 相同或是略低一點

範例如下

sudo /etc/fstab

/etc/fstab

server:/path/to/share /mnt/nfs nfs rw,nfsvers=4,noatime,rsize=32768,wsize=32768 0 0

提高讀取的性能

mount -o async,noac,rsize=1048576 nfs://server/share /mnt

兼顧安全性以及效能的設定可以參考

mount -o async,noac,noatime,nodev,noexec,norecovery,rsize=1048576,tcp,nfsvers=4 nfs://server/share /mnt

讀取大型文件,如影音,透過 readahead 來幫助提高性能,這裡將 readahead 設置為 128 塊(每塊的大小依賴於系統配置,通常是 4KB)

sudo mount -t nfs -o rsize=32768,wsize=32768,readahead=128 server:/path/to/share /mnt/nfs

調整網路配置:

  • 使用高性能網路設備。
  • 調整 TCP/IP 參數,例如 tcp_keepalive 和 tcp_window_size

常見的 NFS 掛載選項

  • async: 允許 NFS 客户端在將數據寫入磁碟之前將其發送到伺服器。這可以提高寫入性能,但可能會導致數據丟失。
  • bg: 在後台掛載 NFS 共享。
  • intr: 允許 NFS 客户端在伺服器無響應時中斷操作。
  • noac: 不使用 NFS 屬性緩衝區。這可以提高性能,但可能會導致文件屬性不一致。
  • noatime: 不更新文件的訪問時間。這可以提高性能,但可能會導致文件元數據不準確。
  • nodev: 不將 NFS 共享上的設備映射到本地設備。
  • noexec: 不允許在本地執行 NFS 共享上的可執行文件。
  • norecovery: 在 NFS 伺服器發生故障時不嘗試重新掛載共享。
  • ro: 以唯讀模式掛載 NFS 共享。
  • rsize: 設置 NFS 客户端每次讀取操作從伺服器接收的最大數據量。
  • rw: 以讀寫模式掛載 NFS 共享。
  • soft: 在 NFS 伺服器無響應時允許 NFS 客户端重試操作。
  • tcp: 使用 TCP 而不是 UDP 進行 NFS 通信。
  • timeo: 設置 NFS 客户端在伺服器無響應之前等待的時間。
  • nfsvers: 指定 NFS 協議版本

其中最常用到的是 async, noac, noatime, rsize, nfsvers.

noatime

多數情況下,禁用對文件訪問時間的更新可以提升性能,因為它減少了對伺服器的寫操作。

rsize和wsize:

對於現代網絡,32768(32KB)或65536(64KB)是比較常見的設定值,能夠提供良好的效能。你可以從這個基點開始,進行實際的性能測試來找到最適合你環境的值。

NFS 版本的比較說明 (nfsvers)

  • NFSv4 比較新,提供了更好的安全性(如Kerberos身份驗證)和效能優化,包括更高效的文件鎖定機制和狀態保持功能。
  • NFSv3 在一些舊系統上仍然很流行,對於不需要v4的安全性增強的環境來說,可能仍是一個好選擇。在某些情況下,它可能由於其無狀態性而提供更好的效能。

監控與調整

使用 nfsstat 這樣的工具來監控 NFS 伺服器的性能,然後根據實際運行情況進行調整。

sudo apt install nfsstat

之後就可以輸入 nfsstat 取得相關資訊

nfsstat

高效能伺服器

使用 NFS Ganesha: NFS Ganesha 高性能的 NFS 代理伺服器