架構設計
- 前端:靜態 HTML 表單提交關鍵字到 CGI 程式。
- 後端:CGI 程式調用
locate 索引查找,sed 轉換路徑為 URL,生成結果頁面。
- 定時任務:
updatedb 更新索引,cron 清理臨時文件。
關鍵組件
/* index.html */
/* search.c 核心邏輯 */
char *data = getenv("QUERY_STRING"); // 獲取 keyname=xxx
sscanf(data, "keyname=%s", keyword); // 簡易解析
sprintf(cmd, "locate '%s' | sed 's#^/usr/local/apache/htdocs#https://ip#' | sed 's#.*#&#' > %s", keyword, temp_file);
system(cmd); // 執行管道命令
/* 輸出重定向到臨時 HTML,再用 meta refresh 跳轉 */
printf("Content-Type: text/html\n");
printf("\n", temp_name);
部署步驟
- 編譯
gcc search.c -o search 放入 /usr/local/apache/cgi-bin/,權限 chmod 755。
chown nobody:nobody /usr/local/apache/temp 確保寫入權限。
/etc/cron.hourly/myupdate:updatedb -U /usr/local/apache/htdocs
/etc/cron.daily/deletetemp:rm -f /usr/local/apache/temp/*
安全與改進建議
- 命令注入風險:
keyword 直接拼入 shell 命令,需嚴格過濾(僅允許字母數字下劃線)。
- 性能:
system() 開銷大,高併發下建議用 C 庫直接調用 sqlite3 或倒排索引庫。
- 解析健壯性:使用
cgi_parse 庫正確處理 URL 編碼、多參數。
- 現代替代:FastCGI + C/C++ 框架 或 Go/Rust 微服務。