纯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。