HTTP-сервер простой командной строки


121

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

Существует ли мертвое простое решение для обслуживания одной небольшой HTML-страницы без необходимости настройки полноценного HTTP-сервера?



2
Почему бы просто не использовать netcat?
Дилан

На самом деле! Используйте FTP, как World Wide Web до HTTP! (Хотя я полагаю, что в начале 1990-х это было не совсем так во всем мире. 😉)
Майкл Шепер,

1
Большая коллекция методов были собраны в этом суть
davidcondrey

Ответы:



160

Попробуйте 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: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, images) с надлежащими типами mime, не требуя настройки (из файлов или иным образом), кроме самой команды (без специфичных для фреймворка серверов и т. д.)
  4. должен запускаться или иметь режим, в котором он может работать, на переднем плане (то есть без демонов)

Например:

  • Витая (Питон)

    twistd -n web -p 8000 --path . 
    
  • Эрланг :

    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
    
  • Ruby 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

Хм .. нормально ;-)
Нихилу 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

Node имеет простой, быстрый и легкий модуль HTTP-сервера. Установить:

sudo npm install http-server -g

(Предполагая, что у вас есть nodeи npmуже установлены.)

Чтобы запустить его, используя текущий каталог в качестве корня сайта:

http-server

Это создает сервер на http://0.0.0.0:8080/.


Оно работает. У меня есть проект Node на машине с 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", но он однопоточный, и за один раз можно загрузить только один клиент, остальные должны подождать. Это решение с 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

Простое исправление / улучшение слегка несправедливого (imho) ответа с отрицательным результатом также может работать. Давайте сначала настроим 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

1

попробуй Кэдди

curl https://getcaddy.com | bash

обслуживать контент с / var / www caddy -root /var/www "browse"

теперь вы найдете сервер по адресу http: // localhost: 2015


Я люблю только caddyиз локального каталога и наслаждаюсь современным и безопасным веб-сервером.
Duvrai

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 на другой машине в локальной сети, и это тоже сработало.
unfa

0

SFK стоит упомянуть здесь

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

отличный многофункциональный инструмент без зависимостей

доступны в обоих вариантах: deb и rpm

sfk httpserv -port 1234

будет обслуживать текущий каталог

sfk httpserv -port 1234 -rw

также позволит загружать файлы


0

Pure 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.