Server HTTP a riga di comando semplice


121

Ho una sceneggiatura che genera un rapporto giornaliero che voglio servire al cosiddetto pubblico in generale. Il problema è che non voglio aggiungere al mio mal di testa la manutenzione di un server HTTP (ad esempio Apache) con tutte le configurazioni e le implicazioni di sicurezza.

Esiste una soluzione semplice morta per servire una piccola pagina HTML senza lo sforzo di configurare un server HTTP completo?



2
Perché non usare semplicemente netcat?
Dylan,

Infatti! Usa FTP, come ha fatto il World Wide Web prima della fine di HTTP! (Anche se suppongo che non fosse così diffuso all'inizio del 1990. 😉)
Michael Scheper

1
Una grande raccolta di metodi è stata compilata in questo senso
davidcondrey il

Risposte:


32

Sì, nweb.

Può essere trovato qui: nweb.c

(precedentemente su ibm.com )

Per compilare nweb.c:

gcc -O -DLINUX nweb.c -o nweb

160

Prova SimpleHTTPServer :

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

Dovrebbe servire qualunque cosa sia nel CWD (es . Index.html ) a http://0.0.0.0:8000 .


11
È possibile specificare un numero di porta in questo modo: python3 -m http.server 1337. Non puoi specificare a quale IP associare, per quanto posso dire. Nota: per ascoltare la porta 80 è necessario disporre dei privilegi di root, ad esempio:sudo python3 -m http.server 80
Hubro,

1
Questo è carino ma ha un problema con il reindirizzamento a un URL con una barra finale aggiunta. Ecco perché preferisco la versione contorta:twistd -n web -p 8000 --path .
Greg Dubicki,

--bind <address>è stato aggiunto in Python 3.4 .
Drewbenn,

1
Per cambiare la porta di ascolto predefinita 8080 (con python2) in qualcos'altro, basta inserire un numero di porta dopo:python -m SimpleHTTPServer 3000
Maksim Luzik

44

C'è un grande elenco di one-line di server statici http :

Per accedere a questo elenco, una soluzione deve:

  1. servire file statici usando la directory corrente (o una directory specificata) come root del server
  2. essere in grado di essere eseguito con un singolo comando a una riga (le dipendenze vanno bene se sono una cosa singola)
  3. servire tipi di file di base (html, css, js, images) con tipi di mime appropriati, non richiede alcuna configurazione (da file o altro) oltre al comando stesso (nessun server specifico del framework, ecc.)
  4. deve essere eseguito o avere una modalità in cui può essere eseguito in primo piano (ovvero senza demoni)

Per esempio:

  • 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

Usa node.js, veloce e leggero.

O

basta usare il semplice nccomando netcat per avviare un webserver veloce su una porta e servire il contenuto di un file comprese le intestazioni di risposta del server.

Riferimento da 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

27
Un processo node.js nudo con solo la shell interattiva in esecuzione richiede 15 MB (7.5 è condiviso) di RAM. E quindi devi eseguire il server HTTP al suo interno. È divertente che le persone lo vedano leggero. ;-)
jpc

Sì, lo considero leggero, puoi ridimensionarlo bene con un ingombro di memoria così ridotto. Per favore leggi thecodinghumanist.com/blog/archives/2011/5/6/… Tuttavia, se trovi ingombrante usare node.js, la semplice utility netcat serve bene allo scopo di breve durata.
Nikhil Mulley

1
Ovviamente hai ragione se confronti il ​​nodo con Apache ma quello che ho trovato divertente era l'aspetto del nodo rispetto a cr.yp.to/publicfile.html o qualcosa di simile. :)
jpc

hmmmmm .. ok ;-)
Nikhil Mulley

8
+1 per la ncsoluzione basata :). Nota che i -neflag per echopotrebbero non essere portatili, usare printfinvece il comando potrebbe essere un'alternativa migliore.
WhiteWinterWolf

29

Dalla versione 5.4.0 PHP ha anche un web server integrato :

php -S localhost:8000

È possibile specificare la directory dei documenti del server Web con -t, ad esempio:

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

Se si desidera poter accedere al server in rete, allora:

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

Caspita è stato facile e utile!
Michael-O,

Questo è davvero bello se vuoi testare php-script localmente.
erik,

15

Il nodo ha un modulo server HTTP semplice, veloce e leggero. Installare:

sudo npm install http-server -g

(Supponendo di avere nodee npmgià installato.)

Per eseguirlo, utilizzando la directory corrente come root del sito Web:

http-server

Questo crea un server acceso http://0.0.0.0:8080/.


Funziona. Ho un progetto Node su una macchina FreeBSD, corro solo npm install -D http-servernella directory del progetto e quindi aggiungo le seguenti righe al mio package.jsonfile: "scripts": { "build": "webpack && cd src/public && http-server" },ora ho solo bisogno di correre npm run buildsulla directory del progetto per avviare il server HTTP, ascoltando sulla porta 8080 per impostazione predefinita.
user3405291

2
Prima ho provato " python3 -m http.server", ma è a thread singolo e solo 1 client può scaricare alla volta, gli altri devono aspettare. Questa soluzione con Node.js funziona meglio, a causa della natura asincrona di Node. Se vuoi condividere un file con più persone, usa questo.
Jabba,

6

Prova a utilizzare 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()')

Le prime due righe sono configurate per il server Web. L'ultima riga crea un semplice server Web, aperto sulla porta 8080, che serve solo file ~/public_html. Se solo un file è in quella directory, allora solo che è esposto: http://localhost:8080/output.txt.


è quello che uso, basta copiare lastline e incollarlo su un .pyfile, quindi eseguirlo python(o renderlo eseguibile). Tieni presente che devi eseguire con l'interprete python 2.x.
Hanan N.

3

Puoi tornare su xinetd . Inserisci il seguente file di configurazione in /etc/xinetd.d/ e ricarica il servizio 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
}

Funziona per i miei scopi di reindirizzamento:

# 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

Server HTTP Ruby WEBrick Oldschool :

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

Assicurati di modificare il DocumentRootper la tua configurazione. Si veda anche questo .


2

Un'altra opzione sarebbe quella di installare lighttpd. Di seguito sono suggeriti i passaggi per installare lighttpd su 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"

Nota: Documentroot è il punto in cui verranno posizionati tutti i file accessibili dal Web. La posizione è / var / wwww

Il passaggio precedente installerà un web server lighttpd di base. Per ulteriori informazioni, consultare i seguenti riferimenti

Riferimenti:


2

Ruby one liner semplice per servire una directory:

ruby -run -e httpd . -p 8080


2

Potrebbe anche funzionare una semplice correzione / miglioramento a una risposta leggermente ingiusta (imho) sotto votata. Configuriamo prima il file html ...

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

Ora puoi servirlo con questo one-liner:

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

Questa idea di base si presta ad altri trucchi che potrebbero funzionare per te tramite catidee di altri o subshell come:

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

Semplice esempio di netcat da inserire nello script bash:

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

11
Non riesce assolutamente a parlare HTTP.
derobert,

Ho provato while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- andando a 127.0.0.1 in effetti restituisce il contenuto. Ho dovuto farlo come root però. Quindi in un modo estremamente rozzo - può fare il lavoro, e mi piace. Ho provato ad andare su my-hostnname.local su un'altra macchina nella LAN e ha funzionato anche.
unfa,

0

Vale la pena menzionare SFK qui

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

un eccellente strumento multiuso senza dipendenze

disponibile in entrambe le versioni deb e rpm

sfk httpserv -port 1234

servirà la directory corrente

sfk httpserv -port 1234 -rw

consentirà anche il caricamento di file


0

Pure bash: un server Web in uno script di shell .

Inoltre, avrai bisogno di xinetd (credo disponibile in qualsiasi distro) per ascoltare la porta ed eseguire lo script quando necessario, quindi non devi codificare tcp stack ecc. In bash.


0

Ho usato queste istruzioni per installare un web server sul mio computer CentOS senza dover usare sudo o toccare alcun file di sistema:

Primo nodo di installazione:

$ 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

quindi installare http-server:

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

quindi eseguire http-server sulla porta 12321:

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

0

Ho migliorato ncun po ' la soluzione in modo che:

  • Aggiunge il filename=suggerimento,
  • Funziona in loop fino a quando Ctrl + C,
  • Salva un PID in /tmp/serveFile-$PORTmodo da poterlo uccidere facilmente in seguito.

.

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

Si potrebbe anche usare, nc -k -l ...ma in questo modo è possibile

  • eseguire azioni personalizzate tra i file pubblicati,
  • fare alternare più file.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.