有時候需要臨時啟動要給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