简单的命令行HTTP服务器


121

我有一个脚本可以生成每日报告,并希望将其提供给所谓的公众。问题是我不想增加所有配置和安全隐患的HTTP服务器(例如Apache)的维护工作。

是否有一个死的简单解决方案来提供一个小的HTML页面,而无需配置完整的HTTP服务器?



2
为什么不只使用netcat?
Dylan

确实!使用FTP,就像HTTP完成之前的万维网一样!(尽管我认为它在1990年代初并不像世界范围内那样。)
Michael Scheper

1
方法的大收藏已编入这个要点
davidcondrey

Answers:



158

试试SimpleHTTPServer

python -m SimpleHTTPServer
# or the Python 3 equivalent
python3 -m http.server

它应该可以在http://0.0.0.0:8000CWD中提供任何服务(例如index.html)。


11
您可以选择指定一个端口号,例如:python3 -m http.server 1337。据我所知,您无法指定要绑定的IP。注意:要监听端口80,您必须具有root特权,例如:sudo python3 -m http.server 80
Hubro 2014年

1
这个很好,但是在重定向到添加了斜杠的URL时存在问题。这就是为什么我更喜欢twistd -n web -p 8000 --path .
扭曲

--bind <address>是在python 3.4中添加的。
drewbenn

1
要将默认监听端口8080(使用python2)更改为其他端口,只需在以下端口后放置端口号:python -m SimpleHTTPServer 3000
Maksim Luzik

44

大量的http静态服务器单行代码

要进入此列表,解决方案必须:

  1. 使用当前目录(或指定目录)作为服务器根目录来提供静态文件
  2. 能够使用一个单行命令运行(如果依赖项是一次性的,则很好)
  3. 使用适当的mime类型提供基本文件类型(html,css,js,图像),除了命令本身(无需框架特定的服务器等)外,无需进行其他配置(来自文件或其他方式)
  4. 必须在前台运行,或者具有可以在前台运行的模式(即没有守护程序)

例如:

  • 扭曲(Python)

    twistd -n web -p 8000 --path . 
    
  • Erlang

    erl -s inets -eval 'inets:start(httpd,[{server_name,"NAME"},{document_root, "."},{server_root, "."},{port, 8000},{mime_types,[{"html","text/html"},{"htm","text/html"},{"js","text/javascript"},{"css","text/css"},{"gif","image/gif"},{"jpg","image/jpeg"},{"jpeg","image/jpeg"},{"png","image/png"}]}]).'
    
  • Plack(Perl)

    cpan Plack
    plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000
    
  • webfs

    webfsd -F -p 8000
    
  • Ruby 1.9.2+

    ruby -run -ehttpd . -p8000
    

43

使用node.js快速,轻巧。

要么

只需使用简单的ncnetcat命令在端口上启动快速Web服务器,并提供文件内容(包括服务器响应标头)即可。

来自维基百科的参考:

http://en.wikipedia.org/wiki/Netcat#Setting_up_a_one-shot_webserver_on_port_8080_to_present_the_content_of_a_file

{ echo -ne "HTTP/1.0 200 OK\r\n\r\n"; cat some.file; } | nc -l -p 8080
{ echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <some.file)\r\n\r\n"; cat some.file; } | nc -l -p 8080

27
仅运行交互式外壳的裸节点.js进程占用15MB(共享7.5)RAM。然后,您必须在其中运行HTTP服务器。人们认为它很轻巧,这很有趣。;-)
jpc 2012年

是的,我认为它重量轻,因此可以以较少的内存占用空间很好地扩展。请阅读thecodinghumanist.com/blog/archives/2011/5/6/… 但是,如果您发现使用node.js麻烦,那么简单的netcat实用程序就可以很好地满足短暂的需求。
Nikhil Mulley'3

1
如果将节点与Apache进行比较,您当然是对的,但是我发现有趣的是,与cr.yp.to/publicfile.html或类似内容相比,节点的外观如何。:)
jpc 2012年

hmmmmm .. ok ;-)
Nikhil Mulley 2012年

8
+1为nc基础解决方案:)。请注意,的-ne标志echo可能不是可移植的,printf相反,使用命令可能是更好的选择。
WhiteWinterWolf's

29

自版本5.4.0起,PHP还具有内置的Web服务器

php -S localhost:8000

您可以使用来指定Web服务器的文档目录-t,例如:

php -S localhost:8000 -t /var/lib/www

如果您希望能够通过网络访问服务器,则:

php -S 0.0.0.0:8000 -t /var/lib/www

哇,简单又有用!
Michael-O

如果您想在本地测试php脚本,那么这是一个很好的选择。
erik

15

Node具有一个简单,快速,轻便的HTTP服务器模块。安装:

sudo npm install http-server -g

(假设你已经nodenpm已安装。)

要运行它,请使用当前目录作为网站根目录:

http-server

这会在上创建服务器http://0.0.0.0:8080/


有用。我在FreeBSD机器上有一个Node项目,我只npm install -D http-server在项目目录中运行,然后在package.json文件中添加以下行:"scripts": { "build": "webpack && cd src/public && http-server" },现在,我只需要npm run build在项目目录中运行以启动HTTP服务器,默认情况下侦听端口8080。
user3405291

2
首先,我尝试了“ python3 -m http.server”,但是它是单线程的,一次只能下载一个客户端,其他需要等待。由于Node的异步特性,因此使用Node.js的此解决方案效果更好。如果要与几个人共享文件,请使用此功能。
贾巴

6

尝试SimpleHTTPServer在Python中使用。

mkdir ~/public_html
command_to_generate_output > ~/public_html/output.txt

(cd ~/public_html; python -c 'import SimpleHTTPServer,BaseHTTPServer; BaseHTTPServer.HTTPServer(("", 8080), SimpleHTTPServer.SimpleHTTPRequestHandler).serve_forever()')

前两行是为Web服务器设置的。最后一行创建了一个简单的Web服务器,该服务器在端口8080上打开,仅提供来自的文件~/public_html。如果该目录中只有一个文件,则仅公开该文件:http://localhost:8080/output.txt


这就是我所使用的,只需复制最后一行并将其粘贴到.py文件上,然后运行python(或使其可执行)即可。请记住,您必须使用python 2.x解释器运行。
Hanan N. 2012年

3

您可以使用xinetd。将以下配置文件放入/etc/xinetd.d/并服务xinetd reload

service http
{
  flags = REUSE IPv4
  protocol = tcp
  socket_type = stream
  port = 80
  wait = no
  user = nobody
  server = /bin/echo
  server_args = -e HTTP/1.0 301 Moved Permanently\nContent-Length: 0\nLocation: https://goo.gl/\n\n
  disable = no
}

适用于我的重定向目的:

# wget 127.0.0.1
--2016-04-04 22:56:20--  http://127.0.0.1/
Connecting to 127.0.0.1:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://goo.gl/ [following]
...

2

Oldschool Ruby WEBrick HTTP服务器:

#!/usr/bin/env ruby

require 'webrick'
server = WEBrick::HTTPServer.new(:Port => 8000,
                                 :DocumentRoot => '~/webrickroot')

# stop server with Ctrl-C
trap('INT') { server.stop }
server.start

确保修改DocumentRoot设置。另请参见


2

另一种选择是安装lighttpd。以下是在Unbuntu 12.04 LTS上安装lighttpd的建议步骤。

apt-get update
apt-get upgrade --show-upgraded
apt-get install lighttpd
ifconfig
http://[your-ip-address]:80
/etc/lighttpd/lighttpd.conf (Edit to add server.port)
server.port = "8080"

注意:Documentroot是所有可访问Web的文件的位置。该位置是/ var / wwww

上面的步骤将安装基本的lighttpd Web服务器。有关更多信息,请参考以下参考

参考文献:




2

对稍微不公平(恕我直言)的否决答案进行简单的修复/增强也可能有效。让我们先设置html文件...

echo '<html><head><title>My Test File</title></head><body><hi>OK!</h1></body></html>' > my_file.html

现在,您可以使用此一线服务:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n" | cat - my_file.html  | nc -l -p 8080; done

这个基本想法可通过其他cat或子shell想法为您提供其他技巧,例如:

while true; do echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\nI think the date is $(date), Have a good day!" | nc -l -p 8080; done

0

放入bash脚本的简单netcat示例:

while true ; do nc -l 80 <index.html ; done 

11
完全无法使用HTTP。
derobert

我尝试过while [ 1=1 ] ; do echo "TEST" | nc -l 80; done-转到127.0.0.1确实返回了内容。我必须以root身份这样做。因此,以一种非常粗糙的方式-它可以完成工作,我喜欢这样。我尝试去局域网中另一台机器上的my-hostnname.local,它也起作用。
unfa




0

我按照以下说明在CentOS机器上安装Web服务器,而不必使用sudo或触摸任何系统文件:

第一个安装节点:

$ cd ~
$ wget https://nodejs.org/download/release/latest/node-v8.6.0-linux-x64.tar.gz
$ tar node-v8.6.0-linux-x64.tar.gz

然后安装http服务器:

$ export PATH=~/node-v8.6.0-linux-x64/bin:$PATH
$ npm install http-server

然后在端口12321上运行http-server:

$ ~/node-v8.6.0-linux-x64/bin/node_modules/http-server/bin/http-server -p 12321

0

nc对此解决方案做了一些改进:

  • 添加filename=提示,
  • 在一个循环中运行,直到Ctrl + C
  • 将PID保存到,/tmp/serveFile-$PORT以便以后可以轻松杀死它。

#!/bin/bash

FILE=$1;
if [ "$FILE" == "" ] ; then echo "Usage: $0 <file-to-serve> [<port:7979>]"; exit; fi
PORT=${2:-7979}
echo Serving $FILE at $PORT, PID: $$
echo $$ > /tmp/serveFilePID-$PORT

while true; do 
    { echo -ne "HTTP/1.0 200 OK\r\nContent-Length: $(wc -c <$FILE)\r\nContent-Disposition: inline; filename=\"$(basename $FILE)\"\r\n\r\n"; cat $FILE; } | nc -l $PORT
    CODE=$?
    #echo "Code: $CODE";
    if [ $CODE -gt 128 ] ; then break; fi;
done;

rm /tmp/serveFilePID-$PORT

一个人也可以使用,nc -k -l ...但是这样您可以

  • 在提供的文件之间进行自定义操作,
  • 使多个文件交替。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.