Prosty serwer HTTP wiersza poleceń


121

Mam skrypt, który generuje codzienny raport, który chcę podawać tak zwanej opinii publicznej. Problem polega na tym, że nie chcę dodawać do problemów związanych z utrzymaniem serwera HTTP (np. Apache) ze wszystkimi konfiguracjami i implikacjami bezpieczeństwa.

Czy istnieje martwe, proste rozwiązanie do obsługi jednej małej strony HTML bez konieczności konfigurowania pełnego serwera HTTP?



2
Dlaczego nie skorzystać z netcata?
Dylan,

W rzeczy samej! Używaj FTP, tak jak w sieci WWW przed zakończeniem HTTP! (Chociaż przypuszczam, że na początku lat 90. nie był tak ogólnoświatowy. 😉)
Michael Scheper,

1
Duży zbiór metod zostały opracowane w tym GIST
davidcondrey

Odpowiedzi:



158

Wypróbuj SimpleHTTPServer :

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

Powinien obsługiwać wszystko, co jest w CWD (np. Index.html) pod adresem http://0.0.0.0:8000 .


11
Opcjonalnie można określić numer portu takiego: python3 -m http.server 1337. Nie mogę określić, z którym adresem IP powiążę, o ile mi wiadomo. Uwaga: Aby nasłuchiwać na porcie 80, musisz mieć uprawnienia roota, np .:sudo python3 -m http.server 80
Hubro,

1
Ten jest fajny, ale ma problem z przekierowaniem do adresu URL z dodanym końcowym ukośnikiem. Dlatego wolę skręconą wersję:twistd -n web -p 8000 --path .
Greg Dubicki

--bind <address>został dodany w Pythonie 3.4 .
drewbenn

1
Aby zmienić domyślny port nasłuchiwania 8080 (z python2) na coś innego, wystarczy wpisać numer portu po:python -m SimpleHTTPServer 3000
Maksim Luzik

44

Istnieje duża lista jedno-liniowych statycznych serwerów HTTP :

Aby dostać się na tę listę, rozwiązanie musi:

  1. podawaj pliki statyczne, używając bieżącego katalogu (lub określonego katalogu) jako katalogu głównego serwera
  2. być w stanie być uruchamiane za pomocą jednego, jednego wiersza polecenia (zależności są w porządku, jeśli są jednorazowe)
  3. obsługują podstawowe typy plików (html, css, js, images) z odpowiednimi typami mime, nie wymagają konfiguracji (z plików lub w inny sposób) poza samą komendą (bez serwerów specyficznych dla frameworku itp.)
  4. musi działać lub mieć tryb, w którym może działać, na pierwszym planie (tzn. bez demonów)

Na przykład:

  • Twisted (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

Zastosowanie node.js, szybki i lekki.

Lub

wystarczy użyć prostej nckomendy netcat, aby uruchomić szybki serwer WWW na porcie i podać zawartość pliku, w tym nagłówki odpowiedzi serwera.

Referencje z Wikipedii:

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
Sam proces node.js z uruchomioną tylko interaktywną powłoką zajmuje 15 MB pamięci RAM (7,5 jest współdzielony). A potem musisz uruchomić w nim serwer HTTP. Zabawne, że ludzie uważają to za lekkie. ;-)
JPC

tak, uważam, że jest lekki, można go dobrze skalować przy mniejszym zużyciu pamięci. Przeczytaj thecodinghumanist.com/blog/archives/2011/5/6/… Jeśli jednak korzystanie z node.js okaże się kłopotliwe, to proste narzędzie netcat dobrze służy krótkotrwałemu celowi.
Nikhil Mulley

1
Oczywiście masz rację, jeśli porównujesz węzeł z Apache, ale moim zdaniem zabawne było to, jak wygląda węzeł w porównaniu do cr.yp.to/publicfile.html lub czegoś podobnego. :)
jpc

hmmmmm .. ok ;-)
Nikhil Mulley

8
+1 za ncrozwiązanie oparte :). Zauważ, że -neflagi dla echomogą nie być przenośne, printfzamiast tego użycie polecenia może być lepszą alternatywą.
WhiteWinterWolf,

29

Od wersji 5.4.0 PHP ma również wbudowany serwer WWW :

php -S localhost:8000

Możesz określić katalog dokumentów serwera WWW -t, na przykład:

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

Jeśli chcesz mieć dostęp do serwera przez sieć, to:

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

Wow, to było łatwe i pomocne!
Michael-O,

Ten jest naprawdę fajny, jeśli chcesz przetestować skrypty php lokalnie.
erik

15

Węzeł ma prosty, szybki i lekki moduł serwera HTTP. Żeby zainstalować:

sudo npm install http-server -g

(Zakładając, że masz nodei npmjuż zainstalowałeś).

Aby go uruchomić, używając bieżącego katalogu jako katalogu głównego witryny:

http-server

Spowoduje to utworzenie serwera http://0.0.0.0:8080/.


To działa. Mam projekt Węzła na maszynie FreeBSD, po prostu uruchamiam npm install -D http-serverwewnątrz katalogu projektu, a następnie dodaję następujące wiersze do mojego package.jsonpliku: "scripts": { "build": "webpack && cd src/public && http-server" },teraz muszę tylko uruchomić npm run buildkatalog projektu, aby uruchomić serwer HTTP, domyślnie nasłuchując na porcie 8080.
user3405291

2
Najpierw próbowałem „ python3 -m http.server”, ale jest to jednowątkowy i tylko 1 klient może pobierać naraz, inni muszą czekać. To rozwiązanie z Node.js działa lepiej, ze względu na asynchroniczny charakter Node. Jeśli chcesz udostępnić plik kilku osobom, użyj tego.
Jabba

6

Spróbuj użyć SimpleHTTPServerw Pythonie.

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

Pierwsze dwa wiersze są skonfigurowane dla serwera WWW. Ostatnia linia tworzy prosty serwer WWW, otwarty na porcie 8080, który obsługuje tylko pliki z ~/public_html. Jeśli tylko jeden plik znajduje się w tym katalogu, to tylko, że jest narażona: http://localhost:8080/output.txt.


właśnie tego używam, po prostu skopiuj ostatnią linię i wklej ją do .pypliku, a następnie uruchom go za pomocą python(lub uczyń go wykonywalnym). Pamiętaj, że musisz uruchomić interpreter Pythona 2.x.
Hanan N.

3

Możesz piggy back na xinetd . Umieść następujący plik konfiguracyjny w /etc/xinetd.d/ i przeładuj serwis 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
}

Działa dla moich celów przekierowania:

# 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

Serwer HTTP Oldschool Ruby WEBrick :

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

Pamiętaj, aby zmodyfikować DocumentRootdla swojej konfiguracji. Zobacz także to .


2

Inną opcją byłoby zainstalowanie lighttpd. Poniżej przedstawiono sugerowane kroki instalacji lighttpd na 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"

Uwaga: Documentroot to miejsce, w którym będą znajdować się wszystkie pliki dostępne w Internecie. Lokalizacja to / var / wwww

Powyższy krok zainstaluje podstawowy serwer WWW lighttpd. Aby uzyskać więcej informacji, zapoznaj się z następującymi źródłami

Bibliografia:




2

Może również działać prosta poprawka / rozszerzenie nieco niesprawiedliwie (imho) odrzuconej odpowiedzi. Najpierw skonfigurujmy plik HTML ...

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

Teraz możesz podawać to za pomocą tego linijki:

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

Ta podstawowa idea nadaje się do innych sztuczek, które mogą działać dla Ciebie za pomocą innych catlub podpowłokowych pomysłów, takich jak:

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

Prosty przykład netcata do umieszczenia w skrypcie bash:

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

11
To całkowicie nie mówi HTTP.
derobert

Próbowałem while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- przejście do 127.0.0.1 rzeczywiście zwraca zawartość. Musiałem to zrobić jako root. A więc w niezwykle prymitywny sposób - może wykonać robotę i to mi się podoba. Próbowałem przejść do my-hostnname.local na innym komputerze w sieci LAN i to też zadziałało.
unfa

0

SFK warto tutaj wymienić

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

doskonałe narzędzie wielofunkcyjne bez żadnych zależności

dostępne w wersjach deb i rpm

sfk httpserv -port 1234

będzie obsługiwał bieżący katalog

sfk httpserv -port 1234 -rw

pozwoli również na przesyłanie plików


0

Pure bash: serwer WWW w skrypcie powłoki .

Będziesz także potrzebował xinetd (uważam, że jest dostępny w dowolnej dystrybucji), aby nasłuchiwać portu i uruchamiać skrypt w razie potrzeby, więc nie musisz kodować stosu TCP itp. W bash.



0

Skorzystałem z tych instrukcji, aby zainstalować serwer WWW na moim komputerze CentOS bez konieczności używania sudo lub dotykania jakichkolwiek plików systemowych:

Pierwszy węzeł instalacyjny:

$ 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

następnie zainstaluj serwer http:

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

następnie uruchom serwer HTTP na porcie 12321:

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

0

Ulepszyłem to ncrozwiązanie, więc:

  • Dodaje filename=podpowiedź,
  • Działa w pętli do czasu Ctrl + C,
  • Zapisuje PID /tmp/serveFile-$PORT, abyś mógł później łatwo go zabić.

.

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

Można również użyć, nc -k -l ...ale w ten sposób możesz

  • wykonywać niestandardowe czynności między obsługiwanymi plikami,
  • uczynić kilka plików na przemian.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.