这可能是不可能的,但我在过去的一个小时里一直在研究,结果一无所获。我有一个bash脚本,它给了我一个特定的输出,我想把这个输出添加到Golang中,以便根据bash脚本的输出重定向网站。抱歉,如果这没有意义,我是去的新手
以下是我必须运行bash脚本并输出值的内容
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
fmt.Printf(string(out))
}
然后,我想使用在另一个函数中输出的值,并重定向URL,就像重定向到URL一样,我希望添加$variable
。这只是我从互联网上复制的一个例子,但这正是我想要复制的。
func redirect(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "**$variable**", 301)
}
func main() {
http.HandleFunc("/", redirect)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
假设您的脚本在启动时只能运行一次,那么这应该可以做到:
var redirectTo string
func redirect(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, redirectTo, 301)
}
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
redirectTo = string(out)
http.HandleFunc("/", redirect)
err = http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
或者,如果你不想有一个全局变量,你可以在运行时生成重定向函数:
func main() {
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, string(out), 301)
})
err = http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
如果你想在out为空时进行处理,你可以这样做:
func redirect(w http.ResponseWriter, r *http.Request) {
if len(redirectTo) == 0 {
http.Error(w, "No URL parsed!", 500)
return
}
http.Redirect(w, r, redirectTo, 301)
}
在这种情况下,这将返回HTTP错误500。
您也可以简单地退出程序,而不是提供:
out, err := exec.Command("/bin/sh", "script.sh").Output()
if err != nil {
log.Fatal(err)
}
if len(out) == 0 {
log.Fatal("no output was returned from script")
}
如果您愿意,也可以在这里向out
添加更多验证,例如,如果它是正确的URL,则可以使用net/url
包。