我目前正在制作一个golang程序,这个程序应该是可以运行的,但是由于某些原因,即使我在cmd中输入了相同的选项(例如 -oN test.txt
),但由于某些原因,即使我在cmd中输入了同样的选项,它也不能运行,并给我这样的提示:"我的程序没有运行"。错误信息 这很奇怪,因为在命令行中,这行可以工作,但当我试图在我的程序中运行它时,它却不能工作。
源代码在这里。
package main
import (
"os/exec"
"os"
"fmt"
"strings"
)
func main(){
fmt.Println("Please enter which scanner tool you wish to use:")
fmt.Println("nmap for nmap")
var toolargs []string
var ipaddress string
var toolchoice string
fmt.Scanln(&toolchoice)
if toolchoice == "nmap" {
toolargs = nmap()
fmt.Println(toolargs)
}else{
fmt.Println("invalid input")
}
fmt.Println("Please enter the IP address you wish to scan:")
fmt.Scanln(&ipaddress)
fmt.Println(toolchoice)
fmt.Println(toolargs)
fmt.Println(ipaddress)
funccmd(toolchoice, toolargs, ipaddress)
fmt.Scanln()
}
func nmap() []string{
var NoOfArgs int
var args1 string
var args2 string
var args3 string
var args4 string
var args5 string
var args []string
fmt.Println("Please enter a number for how many arguments you wish to use:")
fmt.Scanln(&NoOfArgs)
switch NoOfArgs{
case 1:
fmt.Println("Please enter your argument")
fmt.Scanf("%s", &args1)
args = []string{args1}
case 2:
fmt.Println("Please enter your arguments, separated with a blank space between arguments (eg. -sn -sS -O)")
fmt.Scanf("%s %s", &args1, &args2)
fmt.Println(args1)
fmt.Println(args2)
args = []string{args1, args2}
fmt.Println(args)
case 3:
fmt.Println("Please enter your arguments, separated with a blank space between arguments (eg. -sn -sS -O)")
fmt.Scanf("%s %s %s", &args1, &args2, &args3)
args = []string{args1, args2, args3}
case 4:
fmt.Println("Please enter your arguments, separated with a blank space between arguments (eg. -sn -sS -O)")
fmt.Scanf("%s %s %s %s", &args1, &args2, &args3, &args4)
args = []string{args1, args2, args3, args4}
case 5:
fmt.Println("Please enter your arguments, separated with a blank space between arguments (eg. -sn -sS -O)")
fmt.Scanf("%s %s %s %s %s", &args1, &args2, &args3, &args4, &args5)
args = []string{args1, args2, args3, args4, args5}
}
fmt.Println(args)
return args
}
func funccmd(toolchoice string, args []string, ipaddress string){
execpath, _ := exec.LookPath("/usr/bin/nmap")
stringargs := strings.Join(args, " ")
fmt.Println(stringargs)
final := []string{execpath, stringargs, ipaddress}
fmt.Println(final)
cmdNmap := &exec.Cmd{
Path: execpath,
Args: []string{execpath, stringargs, ipaddress},
Stdout: os.Stdout,
Stderr: os.Stdout,
}
fmt.Println(args)
if err := cmdNmap.Run(); err !=nil{
fmt.Println("Error", err);
}
}
问题是你把参数连接到一个单一的字符串中 (stringargs
),然后再将它们传递给 exec.Cmd
. 它们需要在函数中各自成为一个独立的参数。Args
数组。Nmap把第一个参数看成"-oN results.txt",并把它解析为过时的选项"-o "和文件名 "N results.txt"。这个警告正是为了防止这种错误,因为您很可能不是要创建一个名为 "N results.txt "的输出文件。