Basit komut satırı HTTP sunucusu


121

Sözde genel halka sunmak istediğim bir günlük rapor hazırlayan bir senaryom var. Sorun şu ki, tüm konfigürasyonlar ve güvenlik uygulamaları ile birlikte bir HTTP sunucusunun (örn. Apache) önemini eklemek istemiyorum.

Tam gelişmiş bir HTTP sunucusunu yapılandırma çabası olmadan küçük bir HTML sayfasını sunmak için basit ve basit bir çözüm var mı?



2
Neden sadece netcat kullanmıyorsun?
Dylan

Aslında! HTTP bitmeden World Wide Web'in yaptığı gibi FTP kullanın! (Her ne kadar 1990'lı yılların başlarında dünya çapında değildi sanırım. 😉)
Michael Scheper

1
Yöntemlerin büyük bir koleksiyonu bu derlenmektedir özünden
davidcondrey

Yanıtlar:



159

SimpleHTTPServer'ı deneyin :

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

Bu her ne de en görev yapacak gerektiğini CWD (örn index.html) de http://0.0.0.0:8000 .


11
İsteğe bağlı olarak böyle bir port numarasını belirtebilirsiniz: python3 -m http.server 1337. Hangi IP'ye bağlanabileceğimi söyleyemezsiniz. Not: 80 numaralı bağlantı noktasını dinlemek için root sudo python3 -m http.server 80
haklarınız

1
Bu hoş ama son bir eğik çizgi eklenmiş bir URL’ye yönlendirme ile ilgili bir sorun var. Bu yüzden twistd versiyonunu tercih ediyorum:twistd -n web -p 8000 --path .
Greg Dubicki

--bind <address>python 3.4'da eklendi .
drewbenn

1
Varsayılan dinleme portu 8080'i (python2 ile) başka bir şeyle değiştirmek için, sonra şu port numarasını girin:python -m SimpleHTTPServer 3000
Maksim Luzik

44

Bir adet http statik sunucunun biricik bir listesi var :

Bu listeye girebilmek için bir çözümün yapması gerekenler:

  1. Geçerli dizini (veya belirtilen dizini) sunucu kökü olarak kullanarak statik dosyalar sun
  2. tek bir satır komutuyla çalıştırılabilir (bir kerelik bir şeyse bağımlılıklar iyidir)
  3. uygun mime türlerine sahip temel dosya türlerini (html, css, js, resimler) sunun, komutun kendisinde (çerçeveye özgü sunucu yok, vb.) yapılandırma gerektirmez (dosyalardan veya başka şekilde).
  4. Ön planda çalışmalı veya çalışabileceği bir moda sahip olmalı

Örneğin:

  • Bükülmüş (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
    
  • Yakut 1.9.2+

    ruby -run -ehttpd . -p8000
    

43

Kullan node.js, hızlı ve hafif.

Veya

ncbir portta hızlı bir web sunucusu başlatmak ve sunucu yanıt başlıkları dahil bir dosyanın içeriğini sunmak için sadece basit netcat komutunu kullanın.

Vikipedi Referansı:

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
Çalışan etkileşimli kabuk çalıştıran çıplak bir node.js işlemi 15 MB (7.5 paylaşımlı) RAM alır. Ve sonra içindeki HTTP sunucusunu çalıştırmanız gerekir. İnsanların bunu hafif olarak görmesi komik. ;-)
jpc

evet hafif olduğunu düşünüyorum, bu kadar az bellek ayak izi ile iyi ölçeklenebilir. Lütfen thecodinghumanist.com/blog/archives/2011/5/6/… sayfasını okuyun . Ancak, eğer node.js 'i kullanmayı zahmetli bulursanız, basit netcat aracı kısa ömürlü amaca hizmet eder.
Nikhil Mulley

1
Eğer Apache ile düğümü karşılaştırırsanız ama eğlendirici bulduğumda, cr.yp.to/publicfile.html veya benzeri bir şeyle karşılaştırıldığında düğümün nasıl göründüğü elbette haklısınızdır . :)
jpc

;-) tamam .. hmmmmm
Nikhil Mulley

8
Temel ncçözüm için +1 :). Not -neiçin bayraklar echokullanarak, taşınabilir olmayabilir printfdaha iyi bir alternatif olabilir yerine komutu.
WhiteWinterWolf 5:16

29

5.4.0 sürümünden beri PHP ayrıca yerleşik bir web sunucusuna sahiptir :

php -S localhost:8000

-tÖrneğin , web sunucusunun belgeler dizinini belirtebilirsiniz :

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

Sunucuya ağ üzerinden erişebilmek istiyorsanız:

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

Vay bu kolay ve yararlı oldu!
Michael-O,

Yerel olarak php komut dosyalarını test etmek istiyorsanız bu gerçekten güzel.
erik

15

Düğüm, basit, hızlı, hafif bir HTTP sunucu modülüne sahiptir. Yüklemek:

sudo npm install http-server -g

(Varsa nodeve npmzaten yüklediyseniz.)

Geçerli dizini web sitesi kökü olarak kullanarak çalıştırmak için:

http-server

Bu bir sunucu oluşturur http://0.0.0.0:8080/.


İşe yarıyor. Bir FreeBSD makinesinde bir Düğüm projem var, npm install -D http-serverproje dizini içinde çalışıyorum ve ardından dosyama aşağıdaki satırları ekliyorum package.json: "scripts": { "build": "webpack && cd src/public && http-server" },şimdi npm run buildHTTP sunucusunu başlatmak için proje dizininde çalıştırmam gerekiyor , varsayılan olarak 8080 numaralı bağlantı noktasını dinliyordum.
user3405291 14:17

2
İlk önce " python3 -m http.server" denedim , ancak tek iş parçacıklı ve aynı anda yalnızca 1 istemci indirebilir, diğerlerinin beklemesi gerekiyor. Node.js içeren bu çözüm, Node'un zaman uyumsuz olması nedeniyle daha iyi çalışır. Bir dosyayı birkaç kişiyle paylaşmak istiyorsanız, bunu kullanın.
Jabba,

6

SimpleHTTPServerPython'da kullanmayı deneyin .

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

İlk iki satır web sunucusu için ayarlanmıştır. Son satır, 8080 numaralı bağlantı noktasında açılan ve yalnızca dosyalara hizmet veren basit bir web sunucusu oluşturur ~/public_html. Sadece bir dosya bu dizinde ise, o sadece o maruz: http://localhost:8080/output.txt.


Kullandığım şey bu, sadece son satırı kopyalayıp bir .pydosyaya yapıştırın , sonra çalıştırın python(veya çalıştırılabilir hale getirin). Python 2.x yorumlayıcısı ile çalıştırmanız gerektiğini unutmayın.
Hanan N.

3

Üzerinde domuz geri olabilir Xinetd . Aşağıdaki config dosyasını /etc/xinetd.d/ ve service xinetd yeniden yükle içine koyun :

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
}

Yönlendirme amaçlarım için çalışıyor:

# 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 sunucusu:

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

DocumentRootKurulumunuz için değişiklik yaptığınızdan emin olun . Ayrıca bkz bu .


2

Başka bir seçenek de lighttpd'yi kurmak olacaktır. Lighttpd'yi Unbuntu 12.04 LTS'ye kurmak için önerilen adımlar aşağıda açıklanmıştır.

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"

Not: Documentroot, tüm web erişilebilir dosyalarının yer alacağı yerdir. Yer / var / wwww

Yukarıdaki adım, temel bir lighttpd web sunucusu kuracaktır. Daha fazla bilgi için aşağıdaki referanslara bakın.

Referanslar:


2

Bir dizine hizmet etmek için basit Ruby bir liner:

ruby -run -e httpd . -p 8080


2

Biraz haksız yere (imho) aşağı oyla basit bir düzeltme / geliştirme de işe yarayabilir. Önce HTML dosyasını ayarlayalım ...

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

Şimdi bu tek astar ile hizmet edebilirsiniz:

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

Bu temel fikir, sizin catgibi diğer ya da alt kabuk fikirleriyle sizin için çalışabilecek diğer numaralara kendisini verir :

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 betiğine koymak için basit netcat örneği:

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

11
Bu tamamen HTTP konuşamıyor.
derobert

Denedim while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- 127.0.0.1'e gitmek gerçekten içeriği döndürüyor. Bunu kök olarak yapmak zorunda kaldım. Yani son derece kaba bir şekilde - işi halledebilir ve bundan hoşlanırım. Söyleyecektim çalıştı my-hostnname.local LAN başka bir makinede ve çok çalıştı.
takılmadığında

0

SFK burada bahsetmeye değer

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

bağımlılığı olmayan mükemmel bir çok amaçlı alet

hem deb hem de rpm lezzetlerinde bulunur

sfk httpserv -port 1234

mevcut dizine hizmet verecek

sfk httpserv -port 1234 -rw

ayrıca dosya yüklemeye izin verecek


0

Saf bash: Bir kabuk betiğinde bir web sunucusu .

Ayrıca, bağlantı noktasını dinlemek ve gerektiğinde komut dosyasını çalıştırmak için xinetd'e (herhangi bir dağıtımda uygun olduğuna inanıyorum) ihtiyaç duyarsınız, bu nedenle tcp stack vb.



0

Bu talimatları, CentOS makineme sudo kullanmadan veya herhangi bir sistem dosyasına dokunmadan web sunucusu kurmak için kullandım:

İlk kurulum düğümü:

$ 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

sonra http sunucusunu kurun:

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

sonra http-server'ı 12321 portunda çalıştırın:

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

0

ncÇözümü biraz geliştirdim, bu yüzden:

  • filename=İpucu ekler ,
  • Ctrl + C, Kadar bir döngüde çalışır
  • Bir PID kaydeder, /tmp/serveFile-$PORTböylece daha sonra kolayca öldürebilirsiniz.

.

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

Bir de kullanabilirsiniz nc -k -l ...ama bu şekilde yapabilirsiniz

  • sunulan dosyalar arasında özel işlemler yapın,
  • birkaç dosyayı alternatif yapmak.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.