純bash輕型網絡服務器。
簡單的解決方案,可以設置本地網站,而無需任何服務器配置! ! !
這是受Bashttpd的啟發。但是,行為完全不同。有關更多信息,請參見下文。
推介會
如何使用
如何使用(專家)
例子
關於安全性
為什麼為什麼要牧師?
執照?
只是克隆並運行./sherver.sh 。然後,您應該能夠連接到Localhost:8080。您可以通過端口作為參數聆聽: ./sherver.sh 8080 (默認為8080 )。
這是用Bash進行的。它可能無法在另一個外殼中起作用。系統中需要存在以下工具(請注意,它們都是Debian默認安裝的一部分):
envsubst如果您想進行模板socat運行服務器。netcat ,但與並發的HTTP請求無法很好地工作Sherver是一個實現HTTP 1.0部分的Web服務器。即使它以幾行的bash編寫,它也能夠做很多事情:
scripts或file文件夾中添加文件stdout上輸出某些內容,可以運行任何語言的任何腳本或可執行所有這些使Sherver成為運行小型服務器的理想工具,該工具將在本地網絡上提供幾頁。
即使聽起來很棒,Sherver仍然有以下限制:
這就是為什麼Sherver應該留在私人和受控的環境中的原因。不要在互聯網上露出Sherver ! ! !如果您想在Internet上公開您的網站,則應使用了解安全性和並發性(例如NGINX或其他)的工具。
始終在防火牆後面運行Sherver,以防止外部入侵。
有關如何使用Sherver供您自己使用的快速文檔。此處提到的所有變量和函數在腳本/readme.md中都有完整的描述。
您可以做的最簡單的事情是提供靜態頁面:不需要任何處理的純HTML文件。
為此,您只需要將HTML文件放在子目錄文件/頁面中。然後,您可以通過/file/pages/index.html之類的URL訪問您的頁面(如果您的文件名是index.html )。
請注意,您必須在URL中給出完整的文件名,以便Sherver可以找到它。
就像那樣簡單!如果Sherver可以找到該文件,它將提供它。否則,它將返回404錯誤。
您可以從Sherver提供任何類型的文件。從基於文本的CSS或JavaScript到圖像,視頻,Zip ...
只需將文件放入子目錄文件中即可。然後,您可以通過/file/venise.webp這樣的URL引用它們。請注意,最好提供完整的路徑而不是相對路徑。
如果可以找到正確的MIME類型,Sherver將自動提供該文件。它甚至將允許瀏覽器緩存文件,並且只有在文件更改時才會再次使用。如果Sherver找不到該文件,它將返回404錯誤。
對於CSS,JavaScript,Favicon等資源,最好將它們放入子文件夾文件/資源中,儘管您不必這樣做。
有關如何鏈接CSS文件的示例:
< link rel =" stylesheet " type =" text/css " href =" /file/resources/ugly.css " >有關如何將圖片集成在HTML中的示例:
< img src =" /file/venise.webp " alt ="" >在這裡,Sherver變得有用:它可以提供動態頁面,根據上下文構建的服務器端。
為此,您只需要在子文件夾腳本中添加可執行文件即可。可執行文件可以是任何類型的類型(bash腳本,python腳本,任何其他腳本,諸如C ++(C ++)彙編的任何二進制腳本...),一旦Sherver可以執行它(必須具有executable標誌集)。
一旦您在那裡擁有可執行文件,Sherver就會運行它並提供其輸出。請注意,如果您訪問網站的根部,則index.sh是一個特定的名稱,因為它是調度程序執行的名稱(請參見下面的調度程序部分)。如果Sherver無法運行任何文件,它將返回404錯誤。如果可執行文件失敗(返回代碼不是0 ),則將返回500錯誤。
要鏈接可執行文件,您必須省略URL中的文件夾scripts : /page.sh將尋找可執行的./scripts/page.sh 。
可執行文件是從scripts夾中運行的。
bash腳本
Sherver主要用於使用Bash腳本。如果您創建一個bash腳本,那麼您應該做的第一件事是運行函數init_environment 。然後,您將可以訪問以下所有變量:
REQUEST_FULL_STRINGREQUEST_METHODREQUEST_URLREQUEST_HEADERSREQUEST_BODYURL_BASEURL_PARAMETERSDATERESPONSE_HEADERSHTTP_RESPONSE還有許多有用的功能,例如:
add_headersend_responsesend_filesend_error檢查有關腳本/readme.md中的SHERVER_UTILS.sh庫的整個文檔。
標準輸出上寫的所有內容都將發送給客戶端。這是一個非常簡單的腳本,它以文本格式返回請求:
#! /bin/bash
init_environment
if [ " $REQUEST_METHOD " != ' GET ' ] ; then
send_error 405
fi
add_header ' Content-Type ' ' text/plain '
send_response 200 " $REQUEST_FULL_STRING "任何其他腳本或二進製文件
如果您不使用bash,則只能訪問包含完整請求作為字符串的環境變量REQUEST_FULL_STRING 。請求的URL( REQUEST_URL )將作為第一個參數傳遞。
Standart輸出上寫的所有內容都將發送給客戶端。不過,您應該自己編寫響應的標題。
對於BASH腳本,有一個基本的模板引擎與Sherver集成(LOL)。它實際上使用envsubst來替換$VARIABLE的任何出現,如果有的話,變量都會從環境中替換。
您可以將模板放在子文件夾腳本/模板中,儘管不是強制性的。
這是文本文件template.txt的模板(改進我們以前的bash腳本示例):
You entered the following request:
$REQUEST
您將使用以下腳本使用它:
#! /bin/bash
init_environment
if [ " $REQUEST_METHOD " != ' GET ' ] ; then
send_error 405
fi
REQUEST= " $REQUEST_FULL_STRING "
# put REQUEST in the environment so we can use it in our template
export REQUEST
# load the template
response= $( envsubst < ' templates/template.txt ' )
add_header ' Content-Type ' ' text/plain '
send_response 200 " $response "完整的HTML示例如下示例。
支持發布請求。您可以檢查將要GET或POST變量REQUEST_METHOD的值,因此您可以根據請求的類型具有不同的行為。
帖子請求的內容可以在變量REQUEST_BODY中重述。如果數據是由客戶端編碼的URL,則可以使用一些技巧來使用函數parse_url來獲取參數的關聯數組。
任何內容都可以發送回客戶端。您可以通過方法add_header添加正確的MIME類型。
此處提到的所有變量和函數在腳本/readme.md中都有完整的描述。
可以記錄到標準錯誤的任何內容。為了簡化日誌,您可以使用函數log 。
要將日誌保存在文件中,您可以將文件中的錯誤輸出重定向:文件中的錯誤輸出:
./sherver.sh 2> logs.txt默認情況下,請求和響應的標題已記錄,但沒有記錄。
調度員負責要求提供文件或運行腳本,具體取決於請求的UTL。它是在文件dispatcher.sh中實現的。
它目前有4個動作:
/ ),則執行腳本scripts/index.shindex.htm或index.html ,則執行腳本scripts/index.sh/file/ / / file /的啟動/test/dummy.sh scripts/test/dummy.sh )。所有這些行為都可以通過編輯文件deptatcher.sh更改。
首先,您需要創建一個特定的用戶,該用戶將運行具有低特權的sherver.sh 。我們將致電我們的用戶sherver ,我們將整個網站放入其hone目錄中。
我們需要將用戶添加到sudo和netdev組中,因此它能夠管理VPN(顯然,將sudo授予用戶不是一個好主意,這就是為什麼您不應該在Internet上展示該網站的原因)。
useradd -mUG sudo,netdev -s /usr/bin/bash sherver
passwd sherver
...請注意,出於實際原因,您可以將當前用戶添加到sherver組(您必須重新彙編才能使其有效):
adduser USER sherver現在,讓我們在其主目錄中獲取網站
su sherver
cd ~
git clone https://github.com/remileduc/sherver.git
cd sherver
git checkout perso最後,我們需要啟用該服務,以便自動啟動sherver.sh 。為此,請在/usr/share/systemd/中復製文件sherver.service,然後啟用服務:
cp sherver.service /usr/share/systemd/
ln -s /usr/share/systemd/sherver.service /etc/systemd/system/sherver.service
systemctl daemon-reload
systemctl enable sherver.service您可以將我在家中用於管理VPN的腳本作為示例。它可以在Perso分支上訪問。請注意,您需要腳本VPN-mgr.sh才能正確使用它。
請參閱Bashttpd。可以很明顯地說,這沒有任何安全功能。請勿在互聯網上暴露Sherver 。
如果您需要在Internet上公開該網站,則需要構建的真實服務器,該服務器尤其是面對所有這些問題。
不過,在本地網絡上使用它是完美的選擇。它將像您的WiFi連接和防火牆一樣安全。
我想快速設置一台將提供動態頁面的服務器,並可以執行一些Bash腳本,以通過網頁控制我的媒體中心。
我不想安裝和配置Apache或nginx。實際上,我不想要任何配置。
Sherver能夠在沒有任何配置的情況下運行。您只需要在正確的位置添加文件即可。它可以在沒有任何安裝的情況下運行(所有使用的工具都是Debian默認安裝的一部分,除了SOCAT外,還可以使用)。
您可以在perso Branche中看到我的用例。
一切都屬於麻省理工學院許可證。
我們使用mimetype腳本,該腳本在perl許可證範圍內發貨,該腳本/UTILS/MIMETYPE。