Máy chủ HTTP dòng lệnh đơn giản


121

Tôi có một kịch bản tạo ra một báo cáo hàng ngày mà tôi muốn phục vụ cho cái gọi là công chúng nói chung. Vấn đề là tôi không muốn thêm vào sự đau đầu của mình về việc duy trì máy chủ HTTP (ví dụ: Apache) với tất cả các cấu hình và ý nghĩa bảo mật.

Có một giải pháp đơn giản chết người nào để phục vụ một trang HTML nhỏ mà không cần phải cấu hình máy chủ HTTP đầy đủ không?



2
Tại sao không chỉ sử dụng netcat?
Dylan

Thật! Sử dụng FTP, giống như World Wide Web đã làm trước khi HTTP kết thúc! (Mặc dù tôi cho rằng nó không hoàn toàn như thế giới vào đầu những năm 1990. 😉)
Michael Scheper

1
Một bộ lớn các phương pháp đã được biên soạn trong ý chính
davidcondrey

Câu trả lời:


32

Vâng, nweb.

Có thể tìm thấy ở đây: nweb.c

(trước đây tại ibm.com )

Để biên dịch nweb.c:

gcc -O -DLINUX nweb.c -o nweb

160

Hãy dùng thử SimpleHTTPServer :

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

Nó sẽ phục vụ bất cứ điều gì trong CWD (ví dụ index.html) tại http://0.0.0.0:8000 .


11
Bạn có thể tùy ý chỉ định một số cổng như thế này : python3 -m http.server 1337. Bạn không thể chỉ định IP nào sẽ liên kết đến mức tôi có thể nói. Lưu ý: Để nghe cổng 80, bạn phải có quyền root, ví dụ:sudo python3 -m http.server 80
Hubro

1
Điều này là tốt nhưng nó có một vấn đề với việc chuyển hướng đến một URL với một dấu gạch chéo được thêm vào. Đó là lý do tại sao tôi thích phiên bản xoắn:twistd -n web -p 8000 --path .
Greg Dubicki

--bind <address>đã được thêm vào python 3.4 .
drewbenn

1
Để thay đổi cổng nghe mặc định 8080 (với python2) sang một thứ khác, chỉ cần đặt số cổng sau:python -m SimpleHTTPServer 3000
Maksim Luzik

44

Có một danh sách lớn các máy chủ http tĩnh http :

Để có được danh sách này, một giải pháp phải:

  1. phục vụ các tệp tĩnh bằng thư mục hiện tại của bạn (hoặc thư mục được chỉ định) làm gốc máy chủ
  2. có thể được chạy với một lệnh một dòng (phụ thuộc là tốt nếu chúng là một lần)
  3. phục vụ các loại tệp cơ bản (html, css, js, hình ảnh) với các loại mime phù hợp, không yêu cầu cấu hình (từ tệp hoặc cách khác) ngoài chính lệnh (không có máy chủ cụ thể khung, v.v.)
  4. phải chạy hoặc có chế độ nơi nó có thể chạy, ở phía trước (tức là không có trình nền)

Ví dụ:

  • Xoắn (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

Sử dụng node.js, nhanh và nhẹ.

Hoặc là

chỉ cần sử dụng nclệnh netcat đơn giản để khởi động máy chủ web nhanh trên một cổng và phục vụ nội dung của tệp bao gồm các tiêu đề phản hồi của máy chủ.

Tham khảo từ 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
Một tiến trình node.js trần chỉ với lớp vỏ tương tác đang chạy chiếm 15 MB (7,5 được chia sẻ) RAM. Và sau đó bạn phải chạy máy chủ HTTP bên trong nó. Thật buồn cười khi mọi người thấy nó nhẹ. ;-)
jpc

vâng tôi coi nó là trọng lượng nhẹ, bạn có thể mở rộng tốt với ít bộ nhớ như vậy. Vui lòng đọc thecodinghumanist.com/blog/archives/2011/5/6/. Tuy nhiên, nếu bạn thấy khó sử dụng node.js, thì tiện ích netcat đơn giản phục vụ mục đích sống ngắn.
Nikhil Mulley

1
Tất nhiên bạn đúng nếu bạn so sánh nút với Apache nhưng điều tôi thấy thú vị là nút trông như thế nào khi so sánh với cr.yp.to/publicfile.html hoặc một cái gì đó tương tự. :)
jpc

hmmmmm .. ok ;-)
Nikhil Mulley

8
+1 cho ncgiải pháp dựa trên :). Lưu ý rằng các -necờ cho echocó thể không di động, sử dụng printflệnh thay thế có thể là một thay thế tốt hơn.
WhiteWinterWolf

29

Vì phiên bản 5.4.0 PHP cũng có máy chủ web tích hợp :

php -S localhost:8000

Bạn có thể Chỉ định thư mục tài liệu của máy chủ web với -t, ví dụ:

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

Nếu bạn muốn có thể truy cập máy chủ qua mạng thì:

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

Wow thật dễ dàng và hữu ích!
Michael-O

Điều này thực sự tốt nếu bạn muốn kiểm tra các tập lệnh php cục bộ.
erik

15

Node có một mô-đun máy chủ HTTP đơn giản, nhanh, nhẹ. Để cài đặt:

sudo npm install http-server -g

(Giả sử bạn đã nodenpmđã cài đặt.)

Để chạy nó, sử dụng thư mục hiện tại làm trang web gốc:

http-server

Điều này tạo ra một máy chủ trên http://0.0.0.0:8080/.


Nó hoạt động. Tôi có một dự án Node trên máy FreeBSD, tôi chỉ chạy npm install -D http-serverbên trong thư mục dự án và sau đó thêm các dòng sau vào package.jsontệp của mình : "scripts": { "build": "webpack && cd src/public && http-server" },bây giờ tôi chỉ cần chạy npm run buildtrên thư mục dự án để khởi động máy chủ HTTP, mặc định nghe cổng 8080.
dùng3405291

2
Đầu tiên tôi đã thử " python3 -m http.server", nhưng nó chỉ có một luồng và chỉ có 1 khách hàng có thể tải xuống tại một thời điểm, những người khác cần phải chờ. Giải pháp này với Node.js hoạt động tốt hơn, do tính chất không đồng bộ của Node. Nếu bạn muốn chia sẻ một tập tin với nhiều người, hãy sử dụng nó.
Jabba

6

Hãy thử sử dụng SimpleHTTPServertrong 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()')

Hai dòng đầu tiên được thiết lập cho máy chủ web. Dòng cuối cùng tạo ra một máy chủ web đơn giản, được mở trên cổng 8080, chỉ phục vụ các tệp từ đó ~/public_html. Nếu chỉ có một tệp trong thư mục đó, thì chỉ có nó được hiển thị : http://localhost:8080/output.txt.


đó là những gì tôi sử dụng, chỉ cần sao chép dòng cuối cùng và dán nó vào một .pytệp, sau đó chạy nó với python(hoặc làm cho nó có thể thực thi được). Hãy nhớ rằng bạn phải chạy với trình thông dịch python 2.x.
Hanan N.

3

Bạn có thể cõng trên xinetd . Đặt tệp cấu hình sau vào /etc/xinetd.d/ và dịch vụ xinetd tải lại :

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
}

Hoạt động cho mục đích chuyển hướng của tôi:

# 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

Máy chủ 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

Hãy chắc chắn để sửa đổi DocumentRootcho thiết lập của bạn. Xem thêm này .


2

Một lựa chọn khác là cài đặt lighttpd. Sau đây là các bước được đề xuất để cài đặt lighttpd trên Unbfox 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"

Lưu ý: Documentroot là nơi tất cả các tệp có thể truy cập web sẽ được đặt. Vị trí là / var / wwww

Bước trên sẽ cài đặt một máy chủ web lighttpd cơ bản. Để biết thêm thông tin tham khảo các tài liệu tham khảo sau

Người giới thiệu:


2

Đơn giản một lớp lót Ruby để phục vụ một thư mục:

ruby -run -e httpd . -p 8080


2

Một sửa chữa đơn giản / nâng cao cho một câu trả lời bỏ phiếu hơi không công bằng (imho) cũng có thể hoạt động. Trước tiên hãy thiết lập tệp html ...

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

Bây giờ bạn có thể phục vụ nó với một lớp lót này:

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

Ý tưởng cơ bản này dựa trên các thủ thuật khác có thể phù hợp với bạn thông qua các catý tưởng khác hoặc chia nhỏ như:

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

Ví dụ netcat đơn giản để đặt trong tập lệnh bash:

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

11
Điều đó hoàn toàn không nói được HTTP.
derobert

Tôi đã thử while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- đến 127.0.0.1 thực sự trả về nội dung. Tôi đã phải làm điều đó như root. Vì vậy, theo một cách cực kỳ thô thiển - nó có thể hoàn thành công việc, và tôi thích điều đó. Tôi đã thử truy cập my-hostnname.local trên một máy khác trong mạng LAN và nó cũng hoạt động.
unfa

0

SFK đáng nói ở đây

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

một công cụ đa năng tuyệt vời không có phụ thuộc

có sẵn trong cả hai hương vị deb và vòng / phút

sfk httpserv -port 1234

sẽ phục vụ thư mục hiện tại

sfk httpserv -port 1234 -rw

cũng sẽ cho phép tải lên tập tin


0

Pure bash: Một máy chủ web trong tập lệnh shell .

Ngoài ra, bạn sẽ cần xinetd (tôi tin là có sẵn trong bất kỳ bản phân phối nào) để nghe cổng và chạy tập lệnh khi cần, vì vậy bạn không phải viết mã tcp stack vv trong bash.


0

Tôi đã sử dụng các hướng dẫn này để cài đặt máy chủ web trên máy CentOS của mình mà không phải sử dụng sudo hoặc chạm vào bất kỳ tệp hệ thống nào:

Nút cài đặt đầu tiên:

$ 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

sau đó cài đặt máy chủ http:

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

sau đó chạy http-server trên cổng 12321:

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

0

Tôi đã cải thiện ncgiải pháp một chút để nó:

  • Thêm filename=gợi ý,
  • Chạy trong một vòng lặp cho đến khi Ctrl + C,
  • Lưu một PID để /tmp/serveFile-$PORTbạn có thể giết nó sau này một cách dễ dàng.

.

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

Người ta cũng có thể sử dụng nc -k -l ...nhưng theo cách này bạn có thể

  • thực hiện các hành động tùy chỉnh giữa các tệp được phục vụ,
  • làm cho một số tập tin thay thế.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.