Einfacher Befehlszeilen-HTTP-Server

121

Ich habe ein Skript, das täglich einen Bericht erstellt, den ich der sogenannten allgemeinen Öffentlichkeit anbieten möchte. Das Problem ist, dass ich die Wartung eines HTTP-Servers (z. B. Apache) mit allen Konfigurationen und Sicherheitsaspekten nicht zu meinen Kopfschmerzen hinzufügen möchte.

Gibt es eine absolut einfache Lösung für die Bereitstellung einer kleinen HTML-Seite, ohne einen ausgewachsenen HTTP-Server konfigurieren zu müssen?

Cid
quelle
4
Weitere Informationen finden Sie unter der Antwort stackoverflow.com/a/4994745 in Frage Einzeiliger FTP-Server in Python bei Stack Overflow .
Manatwork
2
Warum nicht einfach netcat benutzen?
Dylan
Tatsächlich! Verwenden Sie FTP, wie es das World Wide Web vor dem Abschluss von HTTP getan hat! (Obwohl es in den frühen 1990ern vermutlich nicht ganz so weltweit war. -)
Michael Scheper
1
Eine große Sammlung von Methoden wurde in diesem Kernpunkt zusammengestellt
Davidcondrey

Antworten:

32

Ja, nweb

Kann hier gefunden werden: nweb.c

(vorher bei ibm.com )

So kompilieren Sie nweb.c:

gcc -O -DLINUX nweb.c -o nweb
Alexander
quelle
160

Versuchen Sie SimpleHTTPServer :

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

Es sollte dienen, was auch immer in der CWD (z. B. index.html) unter http://0.0.0.0:8000 ist .

Olivier Lalonde
quelle
11
Optional können Sie eine Portnummer wie folgt angeben: python3 -m http.server 1337. Sie können nicht angeben, an welche IP gebunden werden soll, soweit ich das beurteilen kann. Hinweis: Um Port 80 abhören zu können, müssen Sie über Root-Rechte verfügen, z. B .:sudo python3 -m http.server 80
Hubro
1
Dieser ist nett, aber es gibt ein Problem beim Umleiten zu einer URL mit einem abschließenden Schrägstrich. Deshalb bevorzuge ich die verdrehte Version:twistd -n web -p 8000 --path .
Greg Dubicki
--bind <address>wurde in Python 3.4 hinzugefügt .
Drewbenn
1
Um den Standard-Listening-Port 8080 (mit python2) in einen anderen zu ändern, geben Sie einfach eine Portnummer ein:python -m SimpleHTTPServer 3000
Maksim Luzik,
44

Es gibt eine große Liste von Einzeilern für statische http-Server :

Um auf diese Liste zu gelangen, muss eine Lösung:

  1. Stellen Sie statische Dateien unter Verwendung Ihres aktuellen Verzeichnisses (oder eines angegebenen Verzeichnisses) als Server-Stammverzeichnis bereit
  2. mit einem einzigen, einzeiligen Befehl ausgeführt werden können (Abhängigkeiten sind in Ordnung, wenn sie eine einmalige Sache sind)
  3. Grundlegende Dateitypen (html, css, js, images) mit geeigneten MIME-Typen bereitstellen, keine Konfiguration (aus Dateien oder auf andere Weise) über den Befehl hinaus erfordern (keine Framework-spezifischen Server usw.)
  4. muss im Vordergrund laufen oder einen Modus haben, in dem er laufen kann (dh keine Daemons)

Zum Beispiel:

  • Verdreht (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
    
Evgeny Vereshchagin
quelle
43

Verwenden Sie node.js, schnell und leicht.

Oder

Verwenden Sie einfach den ncBefehl netcat, um einen schnellen Webserver an einem Port zu starten und den Inhalt einer Datei einschließlich der Serverantwort-Header bereitzustellen.

Referenz aus Wikipedia:

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
Nikhil Mulley
quelle
27
Ein bare node.js-Prozess, bei dem nur die interaktive Shell ausgeführt wird, benötigt 15 MB RAM (7,5 wird gemeinsam genutzt). Und dann müssen Sie den HTTP-Server darin ausführen. Es ist lustig, dass die Leute es als leicht empfinden. ;-)
jpc
ja ich halte es für leicht, man kann gut skalieren mit so weniger speicherbedarf. Bitte lesen Sie thecodinghumanist.com/blog/archives/2011/5/6/… . Wenn Sie jedoch die Verwendung von node.js als umständlich empfinden, ist das einfache Dienstprogramm netcat für den kurzlebigen Zweck gut geeignet.
Nikhil Mulley
1
Sie haben natürlich Recht, wenn Sie Node mit Apache vergleichen, aber ich fand es amüsant, wie Node im Vergleich zu cr.yp.to/publicfile.html oder ähnlichem aussieht . :)
jpc
hmmmmm .. ok ;-)
Nikhil Mulley
8
+1 für die ncbasierte Lösung :). Beachten Sie, dass die -neFlags für echomöglicherweise nicht portierbar sind. Die Verwendung des printfBefehls ist jedoch möglicherweise eine bessere Alternative.
WhiteWinterWolf
29

Seit Version 5.4.0 hat PHP auch einen eingebauten Webserver :

php -S localhost:8000

Sie können das Dokumentenverzeichnis des Webservers wie folgt angeben -t:

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

Wenn Sie über das Netzwerk auf den Server zugreifen möchten, gehen Sie wie folgt vor:

php -S 0.0.0.0:8000 -t /var/lib/www
Mann bei der Arbeit
quelle
Wow das war einfach und hilfreich!
Michael-O,
Dieser ist wirklich nett, wenn Sie PHP-Skripte lokal testen möchten.
Erik
15

Der Knoten verfügt über ein einfaches, schnelles und leichtes HTTP-Servermodul. Installieren:

sudo npm install http-server -g

(Vorausgesetzt, Sie haben nodeund npmbereits installiert.)

So führen Sie es aus, indem Sie das aktuelle Verzeichnis als Website-Stammverzeichnis verwenden:

http-server

Dies erstellt einen Server auf http://0.0.0.0:8080/.

ashes999
quelle
Es klappt. Ich habe ein Node-Projekt auf einem FreeBSD-Rechner, starte es nur npm install -D http-serverim Projektverzeichnis und füge dann die folgenden Zeilen zu meiner package.jsonDatei hinzu: "scripts": { "build": "webpack && cd src/public && http-server" },Jetzt muss ich nur noch npm run buildim Projektverzeichnis laufen , um den HTTP-Server zu starten, und lausche standardmäßig auf Port 8080.
user3405291
2
Zuerst habe ich " python3 -m http.server" versucht , aber es ist ein Singlethread und es kann immer nur 1 Client gleichzeitig heruntergeladen werden, die anderen müssen warten. Diese Lösung mit Node.js funktioniert aufgrund der asynchronen Natur von Node besser. Wenn Sie eine Datei für mehrere Personen freigeben möchten, verwenden Sie diese Option.
Jabba
6

Versuchen Sie es SimpleHTTPServerin 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()')

Die ersten beiden Zeilen sind für den Webserver eingerichtet. In der letzten Zeile wird ein einfacher Webserver erstellt, der auf Port 8080 geöffnet ist und nur Dateien von dient ~/public_html. Wenn nur eine Datei in diesem Verzeichnis ist, dann nur , dass freigelegt: http://localhost:8080/output.txt.

Arcege
quelle
das ist was ich benutze, kopiere einfach die letzte Zeile und füge sie in eine .pyDatei ein, starte sie dann mit python(oder mache sie ausführbar). Denken Sie daran, dass Sie mit dem Python 2.x-Interpreter arbeiten müssen.
Hanan N.
3

Sie können auf Xinetd huckepack . Fügen Sie die folgende Konfigurationsdatei in /etc/xinetd.d/ ein und warten Sie das Neuladen von xinetd :

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
}

Funktioniert für meine Weiterleitungszwecke:

# 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]
...
AX-Labs
quelle
2

Oldschool Ruby WEBrick HTTP Server:

#!/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

Stellen Sie sicher, dass Sie das DocumentRootfür Ihr Setup ändern . Siehe auch das .

Gemeinschaft
quelle
2

Eine andere Möglichkeit wäre, lighttpd zu installieren. Im Folgenden finden Sie Vorschläge zur Installation von lighttpd auf einem Unbuntu 12.04 LTS.

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"

Hinweis: In Documentroot werden alle Dateien, auf die über das Internet zugegriffen werden kann, gespeichert. Der Speicherort ist / var / wwww

Mit dem obigen Schritt wird ein einfacher lighttpd-Webserver installiert. Weitere Informationen finden Sie in den folgenden Referenzen

Verweise:

Mahendra Gunawardena
quelle
2

Einfacher Ruby One Liner, um ein Verzeichnis zu bedienen:

ruby -run -e httpd . -p 8080
Travis Reeder
quelle
2

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

  • -o öffnet die URL im Browser
  • -a für alle Schnittstellen
  • -P auth user / pass
  • . Dateien im selben Verzeichnis bereitstellen

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

nwgat
quelle
2

Möglicherweise funktioniert auch eine einfache Korrektur / Verbesserung einer etwas unfairen (imho) abgelehnten Antwort. Lassen Sie uns zuerst die HTML-Datei einrichten ...

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

Jetzt können Sie es mit diesem Einzeiler servieren:

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

Diese Grundidee catbietet sich für andere Tricks an, die für Sie möglicherweise über andere oder untergeordnete Ideen funktionieren, z.

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
Vijay
quelle
0

Einfaches Netcat-Beispiel zum Einfügen eines Bash-Skripts:

while true ; do nc -l 80 <index.html ; done 
Hotrider
quelle
11
Das spricht ganz und gar nicht für HTTP.
Derobert
Ich habe versucht while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- zu 127.0.0.1 zu gehen gibt tatsächlich den Inhalt zurück. Ich musste das allerdings als root machen. Also auf eine extrem grobe Art und Weise - es kann die Arbeit erledigen, und das gefällt mir. Ich habe versucht, auf einem anderen Rechner im LAN auf my-hostnname.local zuzugreifen, und es hat auch funktioniert.
unfa
0

SFK hier erwähnenswert

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

ein ausgezeichnetes Mehrzweckwerkzeug ohne Abhängigkeiten

Verfügbar in den Geschmacksrichtungen deb und rpm

sfk httpserv -port 1234

wird das aktuelle Verzeichnis bedienen

sfk httpserv -port 1234 -rw

ermöglicht auch das Hochladen von Dateien

Tagwint
quelle
0

Pure Bash: Ein Webserver in einem Shell-Skript .

Außerdem benötigen Sie xinetd (ich glaube, dass es in jeder Distribution verfügbar ist), um den Port abzuhören und das Skript bei Bedarf auszuführen, damit Sie keinen tcp-Stack usw. in bash codieren müssen.

Putnik
quelle
0

Ich habe diese Anweisungen verwendet, um einen Webserver auf meinem CentOS-Computer zu installieren, ohne sudo zu verwenden oder Systemdateien zu berühren:

Erster Installationsknoten:

$ 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

dann installiere http-server:

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

Führen Sie dann den http-Server an Port 12321 aus:

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

Ich habe die ncLösung ein bisschen verbessert, damit es:

  • Fügt den filename=Hinweis hinzu,
  • Läuft in einer Schleife bis Ctrl + C,
  • Speichert eine PID, /tmp/serveFile-$PORTdamit Sie sie später leicht töten können.

.

#!/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

Man könnte es nc -k -l ...aber auch so nutzen wie man kann

  • Benutzerdefinierte Aktionen zwischen bereitgestellten Dateien ausführen,
  • mehrere Dateien abwechseln.
Ondra Žižka
quelle