我试图从包含域(未知数量)的文本文件中获取输入,然后将每个域用作参数并获取其服务器类型。如预期的那样,这仅返回最后一个域。如何迭代多个返回值? 下面是代码。 //测试 包主
import (
"bufio"
"time"
"os"
"fmt"
"net/http"
//"github.com/gocolly/colly"
)
var Domain string
var Target string
func main() {
Domain := DomainGrab()
Target := BannerGrab(Domain)
//CheckDB if not listed then add else skip
//RiskDB
//Email
fmt.Println(Domain)
fmt.Println(Target)
}
func BannerGrab(s string) string {
client := &http.Client{}
req, err := http.NewRequest("GET", s, nil)
if err != nil {
log.Fatalln(err)
}
req.Header.Set("User-Agent", "Authac/0.1")
resp, _ := client.Do(req)
serverEntry := resp.Header.Get("Server")
return serverEntry
}
func DomainGrab() string {
//c := colly.NewCollector()
// Open the file.
f, _ := os.Open("domains.txt")
defer f.Close()
// Create a new Scanner for the file.
scanner := bufio.NewScanner(f)
// Loop over all lines in the file and print them.
for scanner.Scan() {
line := scanner.Text()
time.Sleep(2 * time.Second)
//fmt.Println(line)
return line
}
return Domain
}
答案 0 :(得分:1)
如果您想“同时进行”,您将返回一个通道,通过该通道您可以发送要返回的多个内容:
https://play.golang.org/p/iYBGPwfYLYR
func DomainGrab() <-chan string {
ch := make(chan string, 1)
f, _ := os.Open("domains.txt")
defer f.Close()
scanner := bufio.NewScanner(f)
go func() {
// Loop over all lines in the file and print them.
for scanner.Scan() {
line := scanner.Text()
time.Sleep(2 * time.Second)
ch <- line
}
close(ch)
}()
return ch
}
答案 1 :(得分:1)
如果我理解您的问题,则您想读取文件,以某种方式检测到该文件已被修改,并有一种方法可以对客户端代码进行这些修改。
文件不是这样工作的。
您有两个选择:
使用某些特定于操作系统的API-https://www.linuxjournal.com/content/linux-filesystem-events-inotify
使用无限循环读取文件。一次读取文件。将副本保存到内存中。一次又一次地循环读取同一文件,直到新文件不同于复制文件并计算增量。
检查是否有可能使用push
代替pull
来获取新域。控制文件中域名的系统是否有可能直接将数据推送给您?
如果loop
是唯一可能的选项,请在两次文件读取之间设置一些暂停时间以减少系统负载。
当您设法获取新域并需要同时处理它们时,请将其用作@dave suggested。
答案 2 :(得分:0)
可能不是最佳解决方案。但是,我决定摆脱一个单独的功能,而只是覆盖更多的领域。我将在下面的代码中发布期望的代码。现在,我需要解析域,以便根URL和子域仅被扫描一次。
// Main
package main
import (
"log"
"fmt"
"time"
"net/http"
"github.com/gocolly/colly"
)
//var Domain string
var Target string
func main() {
c := colly.NewCollector()
c.OnError(func(r *colly.Response, err error) {
fmt.Println("Request URL:", r.Request.URL, "\n Failed with response:", r.StatusCode)
})
// Find and visit all links
c.OnHTML("a", func(e *colly.HTMLElement) {
e.Request.Visit(e.Attr("href"))
})
c.OnRequest(func(r *colly.Request) {
Domain := r.URL.String()
Target := BannerGrab(Domain)
fmt.Println(Domain)
fmt.Println(Target)
fmt.Println("Dropping By.. ", r.URL)
time.Sleep(1000 * time.Millisecond)
})
c.Visit("http://www.milliondollarhomepage.com/")
}
//CheckDB if not listed else add
//RiskDB
//Email
func BannerGrab(s string) string {
client := &http.Client{}
req, err := http.NewRequest("GET", s, nil)
if err != nil {
log.Fatalln(err)
}
req.Header.Set("User-Agent", "Authac/0.1")
resp, _ := client.Do(req)
serverEntry := resp.Header.Get("Server")
return serverEntry
}