Окна командной строки

#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() функций. Смотрите Документы, на которые я ссылался в своем ответе, все это есть.