#windows #go #cmd #nmap
# #Windows #Вперед #cmd #nmap
Вопрос:
Я просто пытаюсь запустить сканирование nmap в своей системе, используя Go с приведенной ниже основной функцией
func main() {
execErr := exec.Command("cmd","/c","nmap -T4 -A -v localhost")
if execErr != nil {
panic(execErr)
}
}
Его паника. Я попытался выполнить поиск документации в Интернете, но пока не смог найти ничего полезного для Windows. Может кто-нибудь помочь или указать на некоторые ресурсы?
Ответ №1:
exec.Command()
возвращает не error
*Cmd
структуру, а тип, для которого вы затем можете вызвать метод Run()
(или другие методы, см. Примечание Ниже) для выполнения команды следующим образом:
cmd := exec.Command("cmd","/c","nmap -T4 -A -v localhost")
err := cmd.Run()
if execErr != nil {
log.Fatal(err)
}
Ваш код panic
s, потому exec.Command("cmd","/c","nmap -T4 -A -v localhost")
что возвращает допустимый ненулевой указатель на Cmd
struct (сообщение о панике, вероятно, представляет собой полный путь к cmd.exe
указанным вами аргументам and then, которые являются значениями полей Path
и Args
Cmd
struct …).
ПРИМЕЧАНИЕ: Здесь не рекомендуется panic()
использовать log.Fatal()
вместо этого. Также может быть лучше запустить nmap
напрямую и обработать его вывод в коде. Смотрите Примеры чтения другого вывода команды с использованием Output()
CombinedOutput()
и Start()
в зависимости от того, что вы пытаетесь сделать и как ведет себя команда.
Комментарии:
1. Спасибо за ваш ответ. Я пытаюсь создать сканер nmap с помощью golang, где я беру пользовательский ввод из HTML-формы в текстовом поле и запускаю сканирование nmap для этого хоста / IP
cmd,err := exec.Command(
C:Program Файлы (x86)Nmapnmap.exe, "nmap -T4 -A -v localhost").Output() if err != nil { log.Fatal(err) } fmt.Printf("The output is %sn", cmd) }
Этот код выдает следующий результатThe output is Starting Nmap 7.91 ( https://nmap.org ) at 2021-01-17 22:21 Eastern Standard Time
Он запускается, но не ждет завершения2. Я попытался использовать
run()
в качестве альтернативы, но это вообще не дает никакого результата3. Я полагаю, что у вас дважды есть nmap в вашей командной строке, поэтому nmap не может проанализировать аргументы и выдает ошибку в stderr, которую вы не видите, потому
Output()
что фиксирует только стандартный выход (но не ошибку) процесса. Ваш вызов вообще должен бытьexec.Command("pathtonmap.exe", "-T4 -A..."). I am not familiar with
nmap, но если это какой-то интерактивный процесс, вам, вероятно, придется подключиться к егоstd*
каналам с помощьюCmd.Std*Pipe()
функций. Смотрите Документы, на которые я ссылался в своем ответе, все это есть.