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


121

いわゆる一般大衆に提供したい日報を生成するスクリプトがあります。問題は、HTTPサーバー(Apacheなど)の頭痛の種のメンテナンスに、すべての構成とセキュリティの影響を追加したくないことです。

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



2
なぜnetcatを使用しないのですか?
ディラン

確かに!HTTPが終了する前にWorld Wide Webが行ったように、FTPを使用してください!(1990年代初頭の世界規模ではなかったと思いますが。.)
マイケルシェパー

1
メソッドの大規模なコレクションは、この中でコンパイルされた要旨
davidcondrey

回答:



160

SimpleHTTPServerを試してください:

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

http://0.0.0.0:8000のCWD(たとえば、index.html)にあるものすべてを提供する必要があります。


11
オプションで、次のようにポート番号を指定できますpython3 -m http.server 1337。私が知る限り、バインドするIPを指定することはできません。注:ポート80をリッスンするには、root権限が必要です。例:sudo python3 -m http.server 80
Hubro 14年

1
これは便利ですが、末尾にスラッシュが追加されたURLへのリダイレクトに問題があります。私はtwistdバージョンを好む理由です:twistd -n web -p 8000 --path .
グレッグDubicki

--bind <address>python 3.4で追加されました。
ドリューベン

1
:何か他に(python2付き)デフォルトのリスニングポート8080を変更するには、直後にポート番号を入れてpython -m SimpleHTTPServer 3000
マクシムLuzik

44

http静的サーバーのワンライナーの大きなリストがあります

このリストを取得するには、ソリューションで次のことを行う必要があります。

  1. 現在のディレクトリ(または指定されたディレクトリ)をサーバールートとして使用して静的ファイルを提供する
  2. 単一の1行のコマンドで実行できる(1回限りであれば依存関係は問題ありません)
  3. 基本的なファイルタイプ(html、css、js、images)を適切なMIMEタイプで提供し、コマンド自体を超えた構成(ファイルなど)を必要としません(フレームワーク固有のサーバーなどは不要)
  4. フォアグラウンドで実行するか、実行可能なモードにする必要があります(つまり、デーモンはありません)

例えば:

  • ツイスト(Python)

    twistd -n web -p 8000 --path . 
    
  • アーラン

    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
対話型シェルのみが実行されている裸のnode.jsプロセスは、15MB(7.5は共有)のRAMを使用します。そして、その内部でHTTPサーバーを実行する必要があります。人々がそれを軽量であると見るのは面白いです。;-)
jpc

ええ、私はそれを軽量だと考えています、あなたはそのような少ないメモリフットプリントでうまくスケーリングできます。encodinghumanist.com/blog/archives/2011/5/6/をお読みください。 ただし、node.jsを使用するのが面倒な場合は、単純なnetcatユーティリティが短命に役立ちます。
ニキルマレー

1
もちろん、Apacheとノードを比較するのは正しいですが、私がおもしろいと思ったのは、cr.yp.to / publicfile.htmlまたは類似のものと比較したときのノードの外観です。:)
jpc

hmmmmm .. ;-) OK
ニキルMulley

8
ncベースのソリューションの場合は+1 :)。の-neフラグはecho移植性がないprintf場合があり、代わりにコマンドを使用する方がより適切な代替方法である場合があることに注意してください。
ホワイトウィンターウルフ

29

バージョン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

簡単で便利でした。
マイケル-O

phpスクリプトをローカルでテストする場合、これは本当に便利です。
エリック

15

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

sudo npm install http-server -g

(あなたが持っていると仮定するnodeと、npmすでにインストールされています。)

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

http-server

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


できます。FreeBSDマシン上にNodeプロジェクトがあり、npm install -D http-serverプロジェクトディレクトリ内で実行し、次の行をpackage.jsonファイルに追加します。HTTPサーバーを起動するためにプロジェクトディレクトリで"scripts": { "build": "webpack && cd src/public && http-server" },実行するだけでnpm run build、デフォルトでポート8080でリッスンします。
user3405291

2
最初に「python3 -m http.server」を試しましたが、シングルスレッドで、一度にダウンロードできるクライアントは1つだけで、他のクライアントは待つ必要があります。Nodeの非同期の性質により、Node.jsを使用したこのソリューションはより適切に機能します。複数のユーザーとファイルを共有する場合は、これを使用します。
ジャバ

6

SimpleHTTPServerPythonで使用してみてください。

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


それは私が使用するもので、最後の行をコピーして.pyファイルに貼り付けてpythonから実行します(または実行可能にします)。python 2.xインタープリターで実行する必要があることに注意してください。
ハナンN.

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

わずかに不当に(imho)ダウン票された回答に対する単純な修正/強化も機能する可能性があります。最初に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ような他のまたはサブシェルのアイデアを介してあなたのために働くかもしれない他のトリックに役立ちます:

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を話せません。
デロバート14

私が試しwhile [ 1=1 ] ; do echo "TEST" | nc -l 80; done-127.0.0.1に行くことは確かに内容を返します。私はルートとしてそれをしなければなりませんでした。だから非常に粗雑な方法で-それは仕事を成し遂げることができ、私はそれが好きです。LAN内の別のマシンでmy-hostnname.localにアクセスしようとしましたが、それも機能しました。
unfa

0

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

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

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

debおよびrpmフレーバーの両方で利用可能

sfk httpserv -port 1234

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

sfk httpserv -port 1234 -rw

ファイルのアップロードも許可されます


0

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

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


0

以下の手順を使用して、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

私は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 ...が、この方法で

  • 提供されるファイル間でカスタムアクションを実行します。
  • いくつかのファイルを交互にします。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.