我正在尝试使用Go自动化我的侦察工具.到目前为止,我可以在kali(Nikto/whois)中运行两个基本工具.现在我希望它们并行执行,而不是等待一个函数完成.读了一下之后,我才知道这可以通过使用goroutines来实现.但我的代码似乎不起作用:
package main
import (
"log"
"os/exec"
"os"
"fmt"
)
var url string
func nikto(){
cmd := exec.Command("nikto","-h",url)
cmd.Stdout = os.Stdout
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
}
func whois() {
cmd := exec.Command("whois","google.co")
cmd.Stdout = os.Stdout
err := cmd.Run()
if err !=nil {
log.Fatal(err)
}
}
func main(){
fmt.Printf("Please input URL")
fmt.Scanln(&url)
nikto()
go whois()
}
Run Code Online (Sandbox Code Playgroud)
我明白在这里,go whois()会一直执行main(),但我仍然看不到它们都执行并行.
如果我正确地理解了你的问题,你想要同时执行nikto()并whois()同时执行并等到两个都返回.要等到一组goroutine完成,这sync.WaitGroup是一个很好的存档方法.对你来说,它看起来像这样:
func main(){
fmt.Printf("Please input URL")
fmt.Scanln(&url)
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
nikto()
}()
go func() {
defer wg.Done()
whois()
}()
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)
这里wg.Add(2)告诉WaitGroup,我们将等待2个goroutines.
然后你的两个函数在小包装器函数中调用wg.Done(),每个函数完成后也会调用它们.这告诉WaitGroup该函数已完成.该defer关键字只是告诉去吧,执行函数调用,一旦周围的函数返回.go在两次调用包装器函数之前还要注意关键字,这会导致执行在两个单独的goroutine中发生.
最后,一旦这两个够程已经启动,调用wg.Wait()的主要功能模块内,直到wg.Done()被叫了两声,这将发生一次双方nikto()并whois()已完成.