모든 명령을 웹 서버화

타이틀대로, 임의의 커멘드를 Web 서버화하는 커멘드를 만들어 보았습니다.
Go 언어로 만들고 있기 때문에 크로스 플랫폼에서 사용할 수 있습니다.

viewb -Github

사용법은 간단.

이런 식으로 viewb 뒤에 웹 서버화하고 싶은 명령을 계속하면 ...

실행 예
$viewb ls -l /


이렇게 결과를 브라우저에서 확인할 수 있습니다.
액세스 할 때마다 명령이 실행되므로 최신 결과가 항상 반환됩니다.
명령 대신 스크립트를 지정하면 스크립트도 실행할 수 있습니다.



외부 네트워크와의 도통을 확인해 보거나

$viewb ping -c 1 8.8.8.8


프로그램 테스트를 실행하여 결과를 확인하거나

GoTest
$viewb go test


의미없이 서버를 세워 보거나

ItWorks
$viewb echo It works!


사용법은 무한대.

BASIC 인증으로 열쇠를 걸 수도 있습니다. ※인증이 통과할 때까지 명령은 실행되지 않습니다.

balse
$viewb -user laputa -pass balse echo booomb!

내용



다음은 viewb 명령의 소스입니다. Go 언어로 만들고 있습니다.
하는 것이 단순한 만큼 있고 내용도 간단합니다.
독립형 웹 서버를 쉽게 통합하고 배포할 수 있는 것은 Go 언어의 큰 매력이군요.

viewb.go
package main

import (
    "flag"
    "fmt"
    "net/http"
    "os"
    "os/exec"
    "runtime"
    "strconv"
    "strings"
)

var (
    port int
    user string
    pass string
    com  string
)

func main() {
    //parse args
    flag.IntVar(&port, "p", 8080, "port /default:8080")
    flag.StringVar(&user, "user", "", "user (BASIC AUTH)")
    flag.StringVar(&pass, "pass", "", "pass (BASIC AUTH)")
    flag.Parse()
    com = strings.Join(flag.Args(), " ")
    //start server
    fmt.Println("http://localhost" + ":" + strconv.Itoa(port))
    fmt.Println("Stop: Ctrl+C")
    http.HandleFunc("/", handler)
    err := http.ListenAndServe(":"+strconv.Itoa(port), nil)
    if err != nil {
        fmt.Fprintln(os.Stderr, err.Error())
        os.Exit(1)
    }
}

//handler: command result
func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "text/plain; charset=UTF-8")
    if auth(r) == false {
        w.Header().Set("WWW-Authenticate", `Basic realm="MY REALM"`)
        w.WriteHeader(401)
        w.Write([]byte("401 Unauthorized\n"))
        return
    }
    fmt.Fprint(w, cmd(com))
}

//exec command
func cmd(commandString string) string {
    var command string
    var op string
    if runtime.GOOS == "windows" {
        command = "cmd"
        op = "/c"
    } else {
        command = "/bin/sh"
        op = "-c"
    }
    out, err := exec.Command(command, op, commandString).Output()
    if err != nil {
        return string(err.Error())
    }
    return string(out)
}

//basic auth
func auth(r *http.Request) bool {
    if user == "" || pass == "" {
        return true
    }
    _user, _pass, ok := r.BasicAuth()
    if ok == false {
        return false
    }
    return _user == user && _pass == pass
}


요약



실행 파일은 여기에서 삭제할 수 있습니다.
viewb에서 viewb를 실행하면 귀찮은 일이 될 수 있으므로 중지합시다.

좋은 웹페이지 즐겨찾기