Server HTTP baris perintah sederhana

121

Saya memiliki skrip yang menghasilkan laporan harian yang ingin saya layani untuk masyarakat umum. Masalahnya adalah saya tidak ingin menambah perawatan server HTTP sakit kepala saya (misalnya Apache) dengan semua konfigurasi dan implikasi keamanan.

Apakah ada solusi sederhana mati untuk melayani satu halaman HTML kecil tanpa upaya mengkonfigurasi server HTTP penuh sesak nafas?

Cid
sumber
4
Lihat jawaban stackoverflow.com/a/4994745 dalam pertanyaan One line ftp server in python on Stack Overflow .
manatwork
2
Mengapa tidak menggunakan netcat saja?
Dylan
Memang! Gunakan FTP, seperti yang dilakukan World Wide Web sebelum HTTP selesai! (Meskipun saya kira itu tidak cukup di seluruh dunia pada awal 1990-an. 😉)
Michael Scheper
1
Sejumlah besar metode telah dikompilasi dalam inti
davidcondrey

Jawaban:

32

Ya, nweb.

Dapat ditemukan di sini: nweb.c

(sebelumnya di ibm.com )

Untuk mengkompilasi nweb.c:

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

Coba SimpleHTTPServer :

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

Seharusnya akan melayani apa pun yang ada di CWD (misalnya index.html) di http://0.0.0.0:8000 .

Olivier Lalonde
sumber
11
Anda dapat menentukan nomor port seperti ini: python3 -m http.server 1337. Anda tidak dapat menentukan IP mana yang akan diikat sejauh yang saya tahu. Catatan: Untuk mendengarkan port 80 Anda harus memiliki hak akses root, misalnya:sudo python3 -m http.server 80
Hubro
1
Yang ini bagus tetapi memiliki masalah dengan pengalihan ke URL dengan garis miring ditambahkan. Itu sebabnya saya lebih suka versi twistd:twistd -n web -p 8000 --path .
Greg Dubicki
--bind <address>ditambahkan dengan python 3.4 .
drewbenn
1
Untuk mengubah port default mendengarkan 8080 (dengan python2) ke sesuatu yang lain, cukup masukkan nomor port setelah:python -m SimpleHTTPServer 3000
Maksim Luzik
44

Ada daftar besar http server statis satu-baris :

Untuk masuk dalam daftar ini, solusi harus:

  1. melayani file statis menggunakan direktori Anda saat ini (atau direktori yang ditentukan) sebagai root server
  2. dapat dijalankan dengan perintah tunggal, satu baris (dependensi baik-baik saja jika itu hanya satu kali)
  3. melayani tipe file dasar (html, css, js, gambar) dengan tipe mime yang tepat, tidak memerlukan konfigurasi (dari file atau lainnya) di luar perintah itu sendiri (tidak ada server khusus kerangka kerja, dll)
  4. harus menjalankan, atau memiliki mode di mana ia dapat berjalan, di latar depan (yaitu tidak ada daemon)

Sebagai contoh:

  • 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
    
Evgeny Vereshchagin
sumber
43

Gunakan node.js, cepat dan ringan.

Atau

cukup gunakan ncperintah netcat sederhana untuk memulai server web cepat pada port dan menyajikan konten file termasuk header respons server.

Referensi dari 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
sumber
27
Proses bare node.js dengan hanya menjalankan shell interaktif membutuhkan 15MB (7,5 dibagi) RAM. Dan kemudian Anda harus menjalankan server HTTP di dalamnya. Lucu bahwa orang melihatnya ringan. ;-)
jpc
ya saya anggap ringan, Anda dapat skala dengan baik dengan jejak memori kurang. Silakan baca thecodinghumanist.com/blog/archives/2011/5/6/... Namun, jika Anda merasa kesulitan untuk menggunakan node.js, maka utilitas netcat sederhana melayani tujuan jangka pendek dengan baik.
Nikhil Mulley
1
Anda tentu saja benar jika Anda membandingkan node dengan Apache tetapi yang saya temukan lucu adalah bagaimana node terlihat jika dibandingkan dengan cr.yp.to/publicfile.html atau yang serupa. :)
jpc
hmmmmm .. ok ;-)
Nikhil Mulley
8
+1 untuk ncsolusi berbasis :). Perhatikan bahwa -neflags untuk echomungkin tidak portabel, menggunakan printfperintah sebagai gantinya mungkin merupakan alternatif yang lebih baik.
WhiteWinterWolf
29

Karena versi 5.4.0 PHP juga memiliki server web bawaan :

php -S localhost:8000

Anda dapat Menentukan direktori dokumen server web dengan -t, misalnya:

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

Jika Anda ingin dapat mengakses server melalui jaringan, maka:

php -S 0.0.0.0:8000 -t /var/lib/www
manatwork
sumber
Wow itu mudah dan bermanfaat!
Michael-O
Yang ini sangat bagus jika Anda ingin menguji skrip php secara lokal.
erik
15

Node memiliki modul server HTTP sederhana, cepat, dan ringan. Untuk memasang:

sudo npm install http-server -g

(Asumsikan Anda sudah nodedan npmsudah menginstal.)

Untuk menjalankannya, gunakan direktori saat ini sebagai root situs web:

http-server

Ini membuat server aktif http://0.0.0.0:8080/.

ashes999
sumber
Berhasil. Saya memiliki proyek Node pada mesin FreeBSD, saya hanya menjalankan npm install -D http-serverdi dalam direktori proyek dan kemudian menambahkan baris berikut ke package.jsonfile saya : "scripts": { "build": "webpack && cd src/public && http-server" },sekarang saya hanya perlu menjalankan npm run buildpada direktori proyek untuk memulai server HTTP, mendengarkan pada port 8080 secara default.
user3405291
2
Pertama saya mencoba " python3 -m http.server", tetapi ini adalah single-threaded dan hanya 1 klien yang dapat mengunduh sekaligus, yang lain harus menunggu. Solusi ini dengan Node.js bekerja lebih baik, karena sifat async dari Node. Jika Anda ingin berbagi file dengan beberapa orang, gunakan ini.
Jabba
6

Coba gunakan SimpleHTTPServerdengan 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()')

Dua baris pertama adalah pengaturan untuk server web. Baris terakhir membuat server web sederhana, dibuka pada port 8080, yang hanya melayani file dari ~/public_html. Jika hanya satu file dalam direktori tersebut, maka hanya yang terkena: http://localhost:8080/output.txt.

Arcege
sumber
itulah yang saya gunakan, cukup salin baris terakhir dan tempel pada .pyfile, lalu jalankan dengan python(atau membuatnya dapat dieksekusi). Ingatlah bahwa Anda harus menjalankan dengan penerjemah python 2.x.
Hanan N.
3

Anda dapat membonceng xinetd . Masukkan file config berikut ke /etc/xinetd.d/ dan 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
}

Berfungsi untuk tujuan pengalihan saya:

# 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
sumber
2

Server HTTP WEBrick Ruby 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

Pastikan untuk memodifikasi DocumentRootpengaturan Anda. Lihat juga ini .

Komunitas
sumber
2

Pilihan lain adalah menginstal lighttpd. Berikut ini adalah langkah-langkah yang disarankan untuk menginstal lighttpd pada 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"

Catatan: Documentroot adalah tempat semua file yang dapat diakses web akan ditempatkan. Lokasi adalah / var / wwww

Langkah di atas akan menginstal server web lighttpd dasar. Untuk informasi lebih lanjut lihat referensi berikut

Referensi:

Mahendra Gunawardena
sumber
2

Ruby sederhana satu liner untuk melayani direktori:

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

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

  • -o membuka url di browser
  • -a untuk semua antarmuka
  • -P pengguna auth / pass
  • . melayani file dalam direktori yang sama

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

nwgat
sumber
2

Perbaikan / peningkatan sederhana untuk jawaban yang sedikit tidak adil (imho) mungkin juga berfungsi. Mari kita mengatur file html terlebih dahulu ...

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

Sekarang Anda bisa menyajikannya dengan one-liner ini:

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

Ide dasar ini cocok untuk trik-trik lain yang mungkin berhasil untuk Anda melalui catide-ide lain atau subkulit seperti:

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
sumber
0

Contoh netcat sederhana untuk dimasukkan ke dalam skrip bash:

while true ; do nc -l 80 <index.html ; done 
hotrider
sumber
11
Itu sepenuhnya gagal berbicara HTTP.
derobert
Saya mencoba while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- pergi ke 127.0.0.1 memang mengembalikan isinya. Saya harus melakukan itu sebagai root. Jadi dengan cara yang sangat kasar - itu bisa menyelesaikan pekerjaan, dan saya suka itu. Saya mencoba masuk ke my-hostnname.local di komputer lain di LAN dan berhasil juga.
unfa
0

SFK layak disebutkan di sini

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

alat multiguna yang sangat baik tanpa ketergantungan

tersedia dalam rasa deb dan rpm

sfk httpserv -port 1234

akan melayani direktori saat ini

sfk httpserv -port 1234 -rw

juga akan memungkinkan pengunggahan file

Tagwint
sumber
0

Bash murni: Server web dalam skrip shell .

Juga, Anda akan memerlukan xinetd (saya percaya tersedia di distro apa pun) untuk mendengarkan port dan menjalankan skrip saat diperlukan, sehingga Anda tidak perlu kode tcp stack dll di bash.

Putnik
sumber
0

Saya menggunakan instruksi ini untuk menginstal server web pada mesin CentOS saya tanpa harus menggunakan sudo atau menyentuh file sistem apa pun:

Instal node pertama:

$ 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

kemudian instal http-server:

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

kemudian jalankan http-server pada port 12321:

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

Saya telah sedikit memperbaiki ncsolusinya sehingga:

  • Menambahkan filename=petunjuk,
  • Berjalan dalam satu lingkaran sampai Ctrl + C,
  • Menyimpan PID /tmp/serveFile-$PORTagar Anda dapat membunuhnya nanti dengan mudah.

.

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

Satu juga bisa menggunakan nc -k -l ...tetapi dengan cara ini Anda bisa

  • melakukan tindakan khusus antar file yang dilayani,
  • buat beberapa file bergantian.
Ondra Žižka
sumber