간단한 명령 행 HTTP 서버


121

소위 일반 대중에게 제공하려는 일일 보고서를 생성하는 스크립트가 있습니다. 문제는 모든 구성과 보안 영향으로 HTTP 서버 (예 : Apache)의 두통 유지 관리에 추가하고 싶지 않다는 것입니다.

완전한 HTTP 서버를 구성하지 않고도 하나의 작은 HTML 페이지를 제공하는 데 도움이되는 간단한 솔루션이 있습니까?



2
왜 netcat을 사용하지 않습니까?
Dylan

과연! HTTP가 완성되기 전에 월드 와이드 웹 (WWW)처럼 FTP를 사용하십시오! (나는 그것이 1990 년대 초반에 전 세계에있는 것은 아니라고 생각하지만.)
Michael Scheper

1
방법의 큰 컬렉션이 컴파일 된 요지
davidcondrey

답변:



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을 들으려면 루트 권한이 있어야합니다.sudo python3 -m http.server 80
Hubro

1
이것은 좋지만 슬래시가 추가 된 URL로 리디렉션하는 데 문제가 있습니다. 이것이 내가 꼬인 버전을 선호하는 이유입니다.twistd -n web -p 8000 --path .
Greg Dubicki

--bind <address>파이썬 3.4 에 추가되었습니다 .
drewbenn

1
기본 수신 포트 8080 (python2 포함)을 다른 것으로 변경하려면 다음에 포트 번호를 입력하십시오.python -m SimpleHTTPServer 3000
Maksim Luzik

44

http 정적 서버 one-liners큰 목록 이 있습니다 .

이 목록을 얻으려면 솔루션이 다음을 수행해야합니다.

  1. 현재 디렉토리 (또는 지정된 디렉토리)를 서버 루트로 사용하여 정적 파일 제공
  2. 한 줄 명령으로 실행할 수 있습니다 (한 번만 사용하면 종속성이 좋습니다)
  3. 적절한 MIME 유형으로 기본 파일 유형 (html, css, js, 이미지)을 제공하고, 명령 자체 이외의 구성은 필요하지 않습니다 (프레임 워크 별 서버 등이 아님).
  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"}]}]).'
    
  • Plack (펄)

    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빠르고 가볍고 사용하십시오 .

또는

간단한 ncnetcat 명령을 사용 하여 포트에서 빠른 웹 서버를 시작하고 서버 응답 헤더를 포함한 파일의 내용을 제공하십시오.

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
대화식 쉘만 실행되는 bare node.js 프로세스에는 15MB (7.5가 공유 됨)의 RAM이 필요합니다. 그런 다음 내부에서 HTTP 서버를 실행해야합니다. 사람들이 그것을 경량으로 보는 것은 재미있다. ;-)
jpc

예, 경량이라고 생각하면 메모리 사용량이 적어 확장 성이 좋습니다. encodinghumanist.com/blog/archives/2011/5/6/…을 읽으 십시오. 그러나 node.js를 사용하는 것이 번거 롭다면 간단한 netcat 유틸리티는 수명이 짧습니다.
Nikhil Mulley

1
물론 노드를 Apache와 비교할 때 맞습니다 . 하지만 재미있는 점은 cr.yp.to/publicfile.html 또는 이와 비슷한 것을 비교할 때 노드가 어떻게 보이는지 입니다. :)
jpc

hmmmmm .. ok ;-)
Nikhil Mulley

8
nc기반 솔루션의 경우 +1 :). 에 대한 -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

와아 그것은 쉽고 도움이되었다!
Michael-O

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기본적으로 포트 8080을 수신하여 HTTP 서버를 시작하기 위해 프로젝트 디렉토리에서 실행 하면됩니다.
user3405291

2
먼저 " python3 -m http.server"를 시도했지만 단일 스레드이며 한 번에 하나의 클라이언트 만 다운로드 할 수 있으며 다른 클라이언트는 기다려야합니다. Node.js가있는이 솔루션은 Node의 비동기 특성으로 인해 더 잘 작동합니다. 여러 사람과 파일을 공유하려면 이것을 사용하십시오.
Jabba

6

SimpleHTTPServer파이썬에서 사용해보십시오 .

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 인터프리터로 실행해야합니다.
Hanan N.

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

Oldschool Ruby WEBrick HTTP 서버 :

#!/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를 설치하는 것입니다. 다음은 Unbuntu 12.04 LTS에 lighttpd를 설치하는 단계입니다.

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

0

bash 스크립트에 넣는 간단한 netcat 예제 :

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

11
그것은 완전히 HTTP를 말하는 데 실패합니다.
derobert

나는 127.0.0.1로while [ 1=1 ] ; do echo "TEST" | nc -l 80; done 이동하면 실제로 내용을 반환합니다. 그래도 루트로해야했습니다. 따라서 매우 조잡한 방식으로 작업을 수행 할 수 있습니다. LAN의 다른 컴퓨터에서 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

순수 bash : 쉘 스크립트의 웹 서버 .

또한 포트를 수신하고 필요할 때 스크립트를 실행하려면 xinetd (모든 배포판에서 사용 가능하다고 생각)가 필요하므로 bash에서 tcp stack 등을 코딩 할 필요가 없습니다.



0

이 지시 사항을 사용하여 sudo를 사용하거나 시스템 파일을 건드리지 않고 CentOS 머신에 웹 서버를 설치했습니다.

첫 번째 설치 노드 :

$ 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-server를 설치하십시오.

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

그런 다음 포트 12321에서 http-server를 실행하십시오.

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

0

nc솔루션을 조금 개선 했습니다.

  • filename=힌트를 추가합니다.
  • 루프에서 실행까지 Ctrl + C,
  • /tmp/serveFile-$PORT나중에 쉽게 죽일 수 있도록 PID를 저장합니다 .

.

#!/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 ...있지만 이런 식으로 할 수 있습니다

  • 제공된 파일간에 사용자 지정 작업을 수행하고
  • 여러 파일을 교대로 만듭니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.