友快網

導航選單

【web伺服器】常見的單行命令啟動一個web服務的總結,你都做到了嗎?

有時候需要臨時啟動要給Web服務,用於臨時訪問或者提供檔案共享等。為此蟲蟲給大家整理了一下常見的單行命令啟動一個Web服務的總結。下面的單行命令,中的每一個都會在當前(或指定的)目錄中執行一個臨時http Web伺服器,監聽8000埠,各個語言版本基本上都已經覆蓋了,如有遺漏請留言告知。

Docker版本

先來一個基於容器的,這是一個真正容器版本的Apache伺服器,基礎映象包為httpd:2。4-alpine:

docker run -d -p 8000:80 ——name CC-web -v “$PWD”:/usr/local/apache2/htdocs/ httpd:2。4-alpine

預設就是當前資料夾的列表頁面,啟動時候注意安全哦。

Python

Python 2和3版本差異較大,其內建的http服務亦有所差異。

2。x版本:

python -m SimpleHTTPServer 8000

3。x版本:

python -m http。server 8000

除了語言自帶模組,還有大量的第三方模組也可以支援。

twisted (Python應用)

twisted -n web -p 8000 ——path 。

或者:

python -c ‘from twisted。web。server import Site; from twisted。web。static import File; from twisted。internet import reactor; reactor。listenTCP(8000, Site(File(“。”))); reactor。run()’

Ruby語言

ruby -rwebrick -e‘WEBrick::HTTPServer。new(:Port => 8000, :DocumentRoot => Dir。pwd)。start’

同樣Ruby也有第三方http模組可以支援。

adsf(Ruby應用):

gem install adsf

adsf -p 8000

Sinatra (Ruby應用)

gem install sinatra

ruby -rsinatra -e‘set :public_folder, “。”; set :port, 8000’

Perl語言

cpan HTTP::Server::Brick

perl -MHTTP::Server::Brick -e ‘$s=HTTP::Server::Brick->new(port=>8000); $s->mount(“/”=>{path=>“。”}); $s->start’

Plack (Perl應用)

cpan Plack

plackup -MPlack::App::Directory -e ‘Plack::App::Directory->new(root=>“。”);’ -p 8000

Mojolicious (Perl應用)

cpan Mojolicious::Lite

perl -MMojolicious::Lite -MCwd -e ‘app->static->paths->[0]=getcwd; app->start’ daemon -l http://*:8000

Node。js

npm install -g http-server

http-server -p 8000

node-static(Node。js):

npm install -g node-static

static -p 8000

PHP

PHP在大於5。4的版本中內建了http服務,可以直接用-S選項啟動。

php -S 127。0。0。1:8000

Erlang語言

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”}]}])。’

Golang

Golang語言無法直接用一句話實現,需要自己寫個main或者用第三方的模組。

main.go

import “net/http”

func main() {

http。ListenAndServe(“:8000”, http。FileServer(http。Dir(“。”)))

}

然後啟動即可,也非常簡單,但是效能很好。

go run main。go

可以用golang應用,比如caddy,它支援的功能就比較強大了,但是可以簡單化使用。

caddy

yum install yum-plugin-copr

yum copr enable @caddy/caddy

yum install caddy

caddy -port 8000

Rust

Rust語言需要用https模組,由於Rust核心模組中幾乎不帶任何應用模組,需要先用cargo安裝:

cargo install https

然後直接就可以啟動。

http

R語言

R語言下也很簡單,用自帶的servr伺服器模組就可以。Serve是R語言與其他語言的通訊(TCP/IP)介面,客戶端由多種語言實現,像C/C++, Java等。

Rscript -e ‘servr::httd()’ -p8000

dart語言

dart語言自帶dhttpd可以實現:

pub global activate dhttpd

[if not in PATH: pub global run] dhttpd

Crystal語言

使用http/server和eval語言啟動:

crystal eval ‘require “http/server”; HTTP::Server。new([HTTP::StaticFileHandler。new(“。”)])。listen(8000)’

OCaml語言

oCaml語言需要用cohttp和async模組實現:

opam install cohttp async

cohttp-server-async

或者cohttp,lwt和ssl模組也可以。

opam install cohttp lwt ssl

cohttp-server-lwt

Tcl

Tcl語言需要版本8。6 ,Tcllib 1。19 更新版本才能支援,實現也較麻煩:

echo ‘package require httpd 4; ::httpd::server create HTTPD port 8000 myaddr 127。0。0。1 doc_root [pwd]; vwait forever’ | tclsh

Java

Java語言基本上就是可以算是不支援,但是在JDK 1。7以上版本可以用

折衷

辦法,而且只支援一個使用者登陸,不能算是這個合格的Web服務。

echo -e ‘import java。net。*;import java。nio。file。*;public class M{public static void main(String[] args)throws Exception{byte[]b=new byte[16777215];ServerSocket s=new ServerSocket(8000);for(;;)try{Socket c=s。accept();c。getInputStream()。read(b);c。getOutputStream()。write((“HTTP/1。1 200 OK\\r\\n\\r\\n”+new String(Files。readAllBytes(Paths。get(new String(b)。split(“ ”)[1]。substring(1)))))。getBytes());c。getOutputStream()。flush();c。close();}catch(Exception e){}}}’>M。java;javac M。java;java M

。NET Core

Dotnet core使用者可以用dotnet-serve模組,先安裝:

dotnet tool install ——global dotnet-serve

dotnet serve -p 8000

C

C語言寫的web伺服器,可以用webfs:

webfsd -F -p 8000

彙編

組合語言的版本的asmttpd(github/nemasu/asmttpd),之前文章中提到過,這可能最小版本的Web伺服器了,大小隻有6k,不過麻雀雖小功能很全,支援多執行緒,多文件種類,多Http狀態和頭支援。

asmttpd 。 8000

IIS Express:

IIS命令也強行湊一波熱鬧:

C:\> “C:\Program Files (x86)\IIS Express\iisexpress。exe” /path:C:\MyWeb /port:8000

Gawk

Oneline應用怎麼能少得了awk呢?雖然比較麻煩:

gawk ‘@load“filefuncs”;@load“readfile”;func send(s,e,d,t,b){print“HTTP/1。0 ”s“ ”e|&S;print“Content-Length: ”b|&S;print“Content-Type: ”t|&S;print d|&S;close(S);}func cf(x){split(x,y,“/”);for(z in y){print “FOUND ”y[z];if(y[z]==“。。”){return 0;}}return 1;}func mt(f){c=“file -b ——mime-type ”f;r=“”;while((c|getline z)>0){r=r z;}close(c);return r;}BEGIN{if(ARGV[1]!=“”){if(chdir(ARGV[1])){print “Failed to chdir to ”ARGV[1];exit;}ARGC=1;}RS=ORS=“\r\n”;while(1){S=“/inet/tcp/8080/0/0”;while((S|&getline l)>0){split(l,f,“ ”);if(f[1]==“GET”){p=substr(f[2],2)}if(p==“”){p=“index。html”}stat(p,s);if(cf(p)&&s[“type”]==“file”){m=mt(p);o=readfile(p);send(200,“OK”,o,m,s[“size”]);break;}n=“Not Found”;send(404,“Not Found”,n,“text/html”RS,length(n));break;}}}’

PowerShell

PowerShell表示雖然只是路過,但是不願意錯過。

Hso=New-Object Net。HttpListener;$Hso。Prefixes。Add(“http://+:8000/”);$Hso。Start();While ($Hso。IsListening){$HC=$Hso。GetContext();$HRes=$HC。Response;$HRes。Headers。Add(“Content-Type”,“text/plain”);$Buf=[Text。Encoding]::UTF8。GetBytes((GC (Join-Path $Pwd ($HC。Request)。RawUrl)));$HRes。ContentLength64=$Buf。Length;$HRes。OutputStream。Write($Buf,0,$Buf。Length);$HRes。Close()};$Hso。Stop()

從cmd啟動的PowerShell:

Cmd表示藉助孫子PS的魔法,我也可以,雖然啥也看不懂:

PowerShell。exe -nop -enc JABIAHMAbwA9AE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAEgAdAB0AHAATABpAHMAdABlAG4AZQByADsAJABIAHMAbwAuAFAAcgBlAGYAaQB4AGUAcwAuAEEAZABkACgAIgBoAHQAdABwADoALwAvACsAOgA4ADAAMAAwAC8AIgApADsAJABIAHMAbwAuAFMAdABhAHIAdAAoACkAOwBXAGgAaQBsAGUAIAAoACQASABzAG8ALgBJAHMATABpAHMAdABlAG4AaQBuAGcAKQB7ACQASABDAD0AJABIAHMAbwAuAEcAZQB0AEMAbwBuAHQAZQB4AHQAKAApADsAJABIAFIAZQBzAD0AJABIAEMALgBSAGUAcwBwAG8AbgBzAGUAOwAkAEgAUgBlAHMALgBIAGUAYQBkAGUAcgBzAC4AQQBkAGQAKAAiAEMAbwBuAHQAZQBuAHQALQBUAHkAcABlACIALAAiAHQAZQB4AHQALwBwAGwAYQBpAG4AIgApADsAJABCAHUAZgA9AFsAVABlAHgAdAAuAEUAbgBjAG8AZABpAG4AZwBdADoAOgBVAFQARgA4AC4ARwBlAHQAQgB5AHQAZQBzACgAKABHAEMAIAAoAEoAbwBpAG4ALQBQAGEAdABoACAAJABQAHcAZAAgACgAJABIAEMALgBSAGUAcQB1AGUAcwB0ACkALgBSAGEAdwBVAHIAbAApACkAKQA7ACQASABSAGUAcwAuAEMAbwBuAHQAZQBuAHQATABlAG4AZwB0AGgANgA0AD0AJABCAHUAZgAuAEwAZQBuAGcAdABoADsAJABIAFIAZQBzAC4ATwB1AHQAcAB1AHQAUwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAEIAdQBmACwAMAAsACQAQgB1AGYALgBMAGUAbgBnAHQAaAApADsAJABIAFIAZQBzAC4AQwBsAG8AcwBlACgAKQB9ADsAJABIAHMAbwAuAFMAdABvAHAAKAApAA==

NC

NC表示我是網路界的瑞士軍刀:

while true ; do nc -l 8080 < test。html ; done

busybox

busybox表示,咋啥也不說直接上程式碼就OK

busybox httpd -f -p 8000

上一篇:老虎和鱷魚誰更厲害一籌?看看這些老虎和鱷魚誰會是百獸之王之王!
下一篇:【今日影訊】《疑犯追蹤》第二季第11集:圓周率的確是直徑為1的?