web-dev-qa-db-ja.com

シンプルなコマンドラインHTTPサーバー

いわゆる一般の人々に提供したい日次レポートを生成するスクリプトがあります。問題は、すべての構成とセキュリティに影響を与えるHTTPサーバー(Apacheなど)のメンテナンスに頭を悩ませたくないことです。

本格的なHTTPサーバーを構成する手間をかけずに、1つの小さなHTMLページを提供するための完全にシンプルなソリューションはありますか?

134
Cid

はい、nweb。

ここで見つけることができます: nweb.c

(以前は ibm.com

Nweb.cをコンパイルするには:

gcc -O -DLINUX nweb.c -o nweb
34
Alexander

試してみてください SimpleHTTPServer

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

[〜#〜] cwd [〜#〜] (例:index.html)の内容は http://0.0.0.0:80 で提供されます。

173
Olivier Lalonde

http static server one-linersの大きなリスト があります:

このリストを取得するには、ソリューションは次の条件を満たす必要があります。

  1. 現在のディレクトリ(または指定したディレクトリ)をサーバールートとして使用して静的ファイルを提供する
  2. 単一の1行コマンドで実行できる(1回限りのものであれば依存関係は問題ありません)
  3. 基本的なファイルタイプ(html、css、js、画像)を適切なMIMEタイプで提供し、コマンド自体(フレームワーク固有のサーバーなど)以外の設定(ファイルなどから)を必要としない
  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"}]}]).'
    
  • プラック(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
    
50

使用する node.js、高速で軽量。

または

単純なnc netcatコマンドを使用して、ポートでクイック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
45
Nikhil Mulley

バージョン5.4.0以降PHPには 組み込みのWebサーバー)もあります

php -S localhost:8000

-tを使用して、Webサーバーのドキュメントディレクトリを指定できます。次に例を示します。

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

ネットワーク経由でサーバーにアクセスできるようにするには、次のようにします。

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

ノードには、シンプルで高速、軽量のHTTPサーバーモジュールがあります。インストールするには:

Sudo npm install http-server -g

nodenpmがすでにインストールされていると仮定します。)

実行するには、現在のディレクトリをWebサイトのルートとして使用します。

http-server

これにより、http://0.0.0.0:8080/にサーバーが作成されます。

15
ashes999

PythonでSimpleHTTPServerを使用してみてください。

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()')

最初の2行はWebサーバー用にセットアップされています。最後の行は、ポート8080で開かれたシンプルなWebサーバーを作成し、~/public_htmlからのファイルのみを提供します。そのディレクトリにファイルが1つしかない場合は、そのファイルのみが公開されます:http://localhost:8080/output.txt

6
Arcege

単純なRubyディレクトリを提供する1つのライナー:

Ruby -run -e httpd . -p 8080
4
Travis Reeder

xinetd に戻ることができます。次の構成ファイルを/etc/xinetd.d/およびservice 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]
...
3
AXE Labs

わずかに不公平な(imho)の反対票を投じた回答に対する単純な修正/拡張も機能する可能性があります。最初にhtmlファイルを設定しましょう...

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

(上記のHTMLのタイプミスを見つけてくれたSteve Follyに感謝します。修正されました。)

これで、このワンライナーでそれを提供できます:

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または次のようなサブシェルのアイデアを介して機能する可能性がある他のトリックに役立ちます。

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
2
Vijay

./devd -o -a -P devd:devd .

  • -oはブラウザでURLを開きます
  • -aすべてのインターフェース
  • -P auth user/pass
  • 。同じディレクトリでファイルを提供する

https://github.com/cortesi/devd/releases

2
nwgat

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を変更してください。 this も参照してください。

2
user44370

別のオプションは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サーバーをインストールします。詳細については、次のリファレンスを参照してください

参照:

Bashスクリプトに入れる簡単なnetcatの例:

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

キャディを試す

curl https://getcaddy.com | bash

/ var/wwwからコンテンツを提供するcaddy -root /var/www "browse"

現在、サーバーは http:// localhost:2015 にあります

1
nwgat

純粋なbash: シェルスクリプト内のWebサーバー

また、ポートをリッスンし、必要に応じてスクリプトを実行するには、xinetd(どのディストリビューションでも利用できると思います)が必要になるため、tashスタックなどをbashでコーディングする必要はありません。

0
Putnik

ここで言及する価値のあるSFK

http://stahlworks.com/dev/swiss-file-knife.html

依存関係のない優れた多目的ツール

debとrpmの両方のフレーバーで利用可能

sfk httpserv -port 1234

現在のディレクトリを提供します

sfk httpserv -port 1234 -rw

ファイルのアップロードも可能になります

0
Tagwint

これらの手順を使用して、Sudoを使用したり、システムファイルに触れたりすることなく、CentOSマシンにWebサーバーをインストールしました。

最初のインストールノード:

$ 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-serverをインストールします。

$ 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
user674669

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 ...を使用することもできますが、この方法で

  • 提供されるファイル間でカスタムアクションを実行する、
  • 複数のファイルを交互に作成します。
0
Ondra Žižka