web-dev-qa-db-fra.com

Serveur HTTP en ligne de commande simple

J'ai un script qui génère un rapport quotidien que je veux servir au soi-disant grand public. Le problème est que je ne veux pas ajouter à mes maux de tête la maintenance d'un serveur HTTP (par exemple Apache) avec toutes les configurations et les implications de sécurité.

Existe-t-il une solution simple et simple pour servir une petite page HTML sans avoir à configurer un serveur HTTP complet?

134
Cid

Oui, nweb.

Peut être trouvé ici: nweb.c

(précédemment sur ibm.com )

Pour compiler nweb.c:

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

Essayez SimpleHTTPServer :

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

Il devrait servir tout ce qui se trouve dans CWD (par exemple index.html) à http://0.0.0.0:80 .

173
Olivier Lalonde

Il y a une grande liste de one-liners de serveur statique http :

Pour figurer sur cette liste, une solution doit:

  1. servir des fichiers statiques en utilisant votre répertoire actuel (ou un répertoire spécifié) comme racine du serveur
  2. pouvoir être exécuté avec une seule commande d'une seule ligne (les dépendances sont bien si elles sont une seule fois)
  3. servir les types de fichiers de base (html, css, js, images) avec les types mime appropriés, ne nécessite aucune configuration (à partir de fichiers ou autre) au-delà de la commande elle-même (pas de serveurs spécifiques au framework, etc.)
  4. doit s'exécuter, ou avoir un mode où il peut s'exécuter, au premier plan (c'est-à-dire pas de démons)

Par exemple:

  • Tordu (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
    
50
Evgeny Vereshchagin

Utilisation node.js, rapide et léger.

Ou

utilisez simplement la commande nc netcat simple pour démarrer un serveur Web rapide sur un port et servir le contenu d'un fichier, y compris les en-têtes de réponse du serveur.

Référence de 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
45
Nikhil Mulley

Depuis la version 5.4.0 PHP possède également un serveur web intégré :

php -S localhost:8000

Vous pouvez spécifier le répertoire de documents du serveur Web avec -t, par exemple:

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

Si vous souhaitez pouvoir accéder au serveur via le réseau, alors:

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

Le nœud possède un module serveur HTTP simple, rapide et léger. À installer:

Sudo npm install http-server -g

(En supposant que vous avez déjà installé node et npm.)

Pour l'exécuter, en utilisant le répertoire courant comme racine du site Web:

http-server

Cela crée un serveur sur http://0.0.0.0:8080/.

15
ashes999

Essayez d'utiliser SimpleHTTPServer en 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()')

Les deux premières lignes sont configurées pour le serveur Web. La dernière ligne crée un simple serveur Web, ouvert sur le port 8080, qui ne sert que les fichiers de ~/public_html. Si un seul fichier se trouve dans ce répertoire, seul celui-ci est exposé: http://localhost:8080/output.txt.

6
Arcege

Simple Ruby un liner pour servir un répertoire:

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

Vous pouvez vous reporter sur xinetd . Placez le fichier de configuration suivant dans /etc/xinetd.d/ et 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
}

Fonctionne à mes fins de redirection:

# 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

Une simple correction/amélioration d'une réponse votée légèrement injustement (à mon humble avis) pourrait également fonctionner. Configurons d'abord le fichier html ...

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

(Merci à Steve Folly d'avoir attrapé ma faute de frappe dans le code HTML ci-dessus. Corrigé.)

Maintenant, vous pouvez le servir avec ce 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

Cette idée de base se prête à d'autres astuces qui pourraient fonctionner pour vous via d'autres cat ou des idées de sous-shell telles que:

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 ouvre l'url dans le navigateur
  • -a pour toutes les interfaces
  • -P utilisateur/passe d'authentification
  • . servir des fichiers dans le même répertoire

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

2
nwgat

Oldschool Ruby WEBrick Serveur 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

Assurez-vous de modifier le DocumentRoot pour votre configuration. Voir aussi this .

2
user44370

Une autre option serait d'installer lighttpd. Voici les étapes suggérées pour installer lighttpd sur un 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"

Remarque: Documentroot est l'endroit où tous les fichiers accessibles sur le Web seront des emplacements. L'emplacement est/var/wwww

L'étape ci-dessus va installer un serveur Web lighttpd de base. Pour plus d'informations, reportez-vous aux références suivantes

Références:

2

Exemple simple de netcat pour mettre en script bash:

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

essayez caddy

curl https://getcaddy.com | bash

servir le contenu de/var/www caddy -root /var/www "browse"

vous trouvez maintenant le serveur à http: // localhost: 2015

1
nwgat

Pure bash: n serveur web dans un script Shell .

De plus, vous aurez besoin de xinetd (je crois disponible dans n'importe quelle distribution) pour écouter le port et exécuter le script si nécessaire, vous n'avez donc pas à coder la pile tcp, etc. dans bash.

0
Putnik

SFK mérite d'être mentionné ici

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

un excellent outil polyvalent sans dépendances

disponible en versions deb et rpm

sfk httpserv -port 1234

servira le répertoire actuel

sfk httpserv -port 1234 -rw

permettra également le téléchargement de fichiers

0
Tagwint

J'ai utilisé ces instructions pour installer un serveur Web sur ma machine CentOS sans avoir à utiliser Sudo ou à toucher à aucun fichier système:

Premier nœud d'installation:

$ 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

puis installez le serveur http:

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

puis exécutez le serveur http sur le port 12321:

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

J'ai un peu amélioré la solution nc pour qu'elle:

  • Ajoute le filename= indice,
  • Fonctionne en boucle jusqu'à Ctrl + C,
  • Enregistre un PID dans /tmp/serveFile-$PORT afin que vous puissiez le tuer facilement plus tard.

.

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

On pourrait également utiliser nc -k -l ... mais de cette façon vous pouvez

  • faire des actions personnalisées entre les fichiers servis,
  • faire alterner plusieurs fichiers.
0
Ondra Žižka