Простий сервер командного рядка HTTP


121

У мене є сценарій, який генерує щоденний звіт, який я хочу подати для так званої широкої громадськості. Проблема полягає в тому, що я не хочу додавати головному головному боці HTTP-сервера (наприклад, Apache) з усіма конфігураціями та наслідками для безпеки.

Чи існує мертве просте рішення для обслуговування однієї невеликої HTML сторінки без зусиль налаштування повномасштабного сервера HTTP?



2
Чому б просто не використовувати netcat?
Ділан

Справді! Використовуйте FTP, як всесвітня павутина до завершення HTTP! (Хоча я думаю, це було не так у всьому світі на початку 1990-х..)
Майкл Шепер

Відповіді:



159

Спробуйте SimpleHTTPServer :

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

Він повинен обслуговувати все, що є в CWD (наприклад, index.html) за адресою http://0.0.0.0:8000 .


11
При бажанні ви можете вказати номер порту , як це: python3 -m http.server 1337. Ви не можете вказати, до якого IP-адреси слід зв’язати, наскільки я можу сказати. Примітка: Для прослуховування порту 80 ви повинні мати права root, наприклад:sudo python3 -m http.server 80
Hubro

1
Це добре, але у нього є проблема з перенаправленням на URL із доданим косою косою рисою. Ось чому я віддаю перевагу твіст-версії:twistd -n web -p 8000 --path .
Грег Дубіцький

--bind <address>додавали в python 3.4 .
drewbenn

1
Щоб змінити порт 8080 прослуховування за замовчуванням (з python2) на щось інше, просто поставте номер порту після:python -m SimpleHTTPServer 3000
Максим Лузик

44

Існує великий список одношарових статичних серверів http :

Щоб потрапити до цього списку, рішення повинно:

  1. обслуговувати статичні файли, використовуючи поточний каталог (або вказаний каталог) як корінь сервера
  2. вміти запускатися за допомогою однієї рядкової команди (залежності добре, якщо вони одноразові)
  3. обслуговують основні типи файлів (html, css, js, зображення) з належними типами mime, не потребують конфігурації (з файлів чи іншим способом) за межами самої команди (відсутність конкретних серверів, що відповідають рамкам тощо)
  4. повинен запускати або мати режим, де він може працювати, на передньому плані (тобто немає демонів)

Наприклад:

  • Скручений (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"}]}]).'
    
  • Стійка (Perl)

    cpan Plack
    plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000
    
  • webfs

    webfsd -F -p 8000
    
  • Рубін 1.9.2+

    ruby -run -ehttpd . -p8000
    

43

Використовуйте node.js, швидко та легко.

Або

просто використовуйте просту ncкоманду netcat, щоб запустити швидкий веб-сервер на порт і обслуговувати вміст файлу, включаючи заголовки відповіді сервера.

Довідка з Вікіпедії:

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
Голий процес node.js з запущеною тільки інтерактивною оболонкою займає 15 Мб оперативної пам'яті (7,5 поділяється). І тоді вам доведеться запустити сервер HTTP всередині нього. Смішно, що люди сприймають це як легке. ;-)
jpc

так, я вважаю це невеликою вагою, ви можете добре масштабувати такий менший слід пам'яті. Будь ласка, прочитайте thecodinghumanist.com/blog/archives/2011/5/6/… Однак, якщо ви вважаєте, що використовувати node.js громіздко, то проста утиліта netcat добре служить короткочасній меті.
Nikhil Mulley

1
Ви, звичайно, маєте рацію, якщо порівнювати вузол з Apache, але те, що я виявив кумедним, це те, як виглядає вузол у порівнянні з cr.yp.to/publicfile.html або щось подібне. :)
jpc

hmmmmm .. ок ;-)
Nikhil Mulley

8
+1 за ncбазовим рішенням :). Зауважте, що -neпрапори для " echoМожливо" не є портативними, використання printfкращої альтернативи може використовувати команду.
WhiteWinterWolf

29

Оскільки у версії 5.4.0 PHP також має вбудований веб-сервер :

php -S localhost:8000

Ви можете вказати каталог документів веб-сервера за допомогою -t, наприклад:

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

Якщо ви хочете мати доступ до сервера через мережу, виконайте вказані нижче дії.

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

Нічого собі, це було легко і корисно!
Майкл-О

Цей дійсно приємно, якщо ви хочете тестувати php-скрипти локально.
erik

15

У вузлі є простий, швидкий, легкий модуль сервера HTTP. Щоб встановити:

sudo npm install http-server -g

(Якщо у вас є nodeі npmвже встановлений.)

Щоб запустити його, використовуючи поточний каталог як корінь веб-сайту:

http-server

Це створює сервер на http://0.0.0.0:8080/.


Це працює. У мене є проект «Вузол» на машині FreeBSD, я просто запускаю npm install -D http-serverвсередині каталогу проектів, а потім додаю у свій package.jsonфайл наступні рядки : "scripts": { "build": "webpack && cd src/public && http-server" },тепер мені просто потрібно запустити npm run buildв каталог проектів, щоб запустити сервер HTTP, прослуховуючи порт 8080 за замовчуванням.
user3405291

2
Спочатку я спробував " python3 -m http.server", але це однопоточний і одночасно може завантажувати лише 1 клієнт, іншим потрібно почекати. Це рішення з Node.js працює краще, завдяки асинхронному характеру Node. Якщо ви хочете поділитися файлом з кількома людьми, скористайтеся цим.
Джабба

6

Спробуйте використовувати SimpleHTTPServerв 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()')

Перші два рядки - це налаштування для веб-сервера. Останній рядок створює простий веб-сервер, відкритий на порту 8080, який обслуговує лише файли з ~/public_html. Якщо тільки один файл знаходиться в цій директорії, то тільки те , що піддається впливу: http://localhost:8080/output.txt.


ось що я використовую, просто скопіюйте останній рядок і вставте його у .pyфайл, після чого запустіть його python(або зробіть його виконуваним). Майте на увазі, що вам потрібно запустити інтерпретатор python 2.x.
Ханан Н.

3

Ви можете піггі назад на xinetd . Помістіть такий файл конфігурації у /etc/xinetd.d/ та перезавантажте службу 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
}

Працює для моїх цілей переадресації:

# 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

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

Не забудьте змінити налаштування DocumentRootдля вашої установки. Дивіться також це .


2

Іншим варіантом буде встановити lighttpd. Далі пропонуються етапи встановлення lighttpd на 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"

Примітка: Documentroot - це місця, де будуть розміщені всі файли, доступні в Інтернеті. Місцезнаходження / var / wwww

Наведений вище крок встановить базовий веб-сервер lighttpd. Для отримання додаткової інформації зверніться до наступних посилань

Список літератури:



2

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

  • -відкриє URL-адресу в браузері
  • -а для всіх інтерфейсів
  • -P авторизований користувач / пропуск
  • . обслуговувати файли в одному каталозі

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


2

Просте виправлення / доповнення до дещо несправедливо (імхо) проголосованої відповіді також може спрацювати. Давайте спочатку налаштуємо файл html ...

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

Тепер ви можете подати його за допомогою цього одноклапашника:

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

Ця основна ідея піддається іншим хитрощам, які можуть працювати для вас за допомогою інших catабо підзарядних ідей, таких як:

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

Простий netcat приклад для введення bash-скрипту:

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

11
Це повністю не відповідає HTTP.
дероберт

Я спробував while [ 1=1 ] ; do echo "TEST" | nc -l 80; done- перехід на 127.0.0.1 справді повертає вміст. Мені довелося це робити як корінь. Тож надзвичайно грубо - це може зробити роботу, і мені це подобається. Я спробував перейти на my-hostnname.local на іншій машині в локальній мережі, і він теж працював.
несправжнє

0

Тут варто згадати SFK

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

відмінний багатоцільовий інструмент без залежностей

доступні як в дебю, так і в обороті в хвилину

sfk httpserv -port 1234

буде обслуговувати поточний каталог

sfk httpserv -port 1234 -rw

також дозволить завантажувати файли


0

Чистий bash: Веб-сервер у сценарії оболонки .

Крім того, вам знадобиться xinetd (я вважаю, доступний в будь-якому дистрибутиві), щоб прослухати порт і запустити сценарій, коли це потрібно, тому вам не доведеться кодувати tcp стек і т.д. в bash.



0

Я використовував ці вказівки для встановлення веб-сервера на моєму пристрої CentOS, не використовуючи sudo або торкаючись жодних системних файлів:

Спочатку встановіть вузол:

$ 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

потім встановіть http-сервер:

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

потім запустіть http-сервер на порту 12321:

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

0

Я ncтрохи вдосконалив рішення, так що:

  • Додає filename=підказку,
  • Працює в циклі до тих пір Ctrl + C,
  • Зберігає PID, щоб /tmp/serveFile-$PORTпотім можна було легко вбити його пізніше.

.

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

Можна також скористатися, nc -k -l ...але так можна

  • робити спеціальні дії між файлами, що подаються,
  • зробити кілька файлів чергувати.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.