我正在尝试使用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()
为止,但是我仍然看不到它们都是并行执行的。
答案 0 :(得分:5)
如果我正确理解了您的问题,则希望并行执行nikto()
和whois()
并等待它们都返回。要等到一组goroutine完成后,here是归档此文件的好方法。对您来说,看起来可能像这样:
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都启动,则在主功能块内对wg.Wait()
的调用将被调用两次,直到wg.Done()
被调用,nikto()
和{{1}都将发生一次}完成。