我正在尝试使用 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()
}
我明白这里 go whois()
会执行到 main()
会执行,但我仍然看不到它们同时执行。
请您参考如下方法:
如果我对你的问题的理解正确,你想同时执行 nikto()
和 whois()
并等待两者返回。等到一组 goroutines 完成,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()
}
这里 wg.Add(2)
告诉 WaitGroup,我们将等待 2 个 goroutine。
然后你的两个函数在小包装函数中被调用,一旦每个函数完成,它们也会调用 wg.Done()
。这告诉 WaitGroup,该函数已完成。 defer
关键字只是告诉 Go,一旦周围的函数返回,就执行函数调用。还要注意两次调用包装函数之前的 go
关键字,这会导致在 2 个单独的 goroutine 中执行。
最后,一旦两个 goroutines 都启动了,在 main 函数 block 中调用 wg.Wait()
直到 wg.Done()
被调用两次,这将在 nikto()
和 whois()
完成后发生。