在Golang中使用psexec时缺少stdout

时间:2018-10-13 14:42:59

标签: go psexec

在远程计算机上,我只是使用psexec.exe来运行特定命令,在shell中进行测试时,cmd的输出是完整的。

在Golang中提交cmd时仅打印出第一行。

我试图在Linux平台上使用winexe,但是Symantec防病毒软件将其视为PUA,然后我又回到Windows平台。

func main() {
  cmd := exec.Command("C:\\Users\\v\\go\\src\\asys\\ss\\psexec.exe", "\\\\192.168.0.64",  "-nobanner", "-accepteula", "-u", "vz", "-p", "1",  "-s", "cmd", "/c", "ipconfig")
  var out bytes.Buffer
  multi := io.MultiWriter(os.Stdout, &out)
  cmd.Stdout = multi
  if err := cmd.Run(); err != nil {
    log.Fatalln(err)
  }
  fmt.Printf("\n*** FULL OUTPUT *** %s\n", out.String())
}

输出:

Windows IP Configuration
*** FULL OUTPUT ***
Windows IP Configuration
Process finished with exit code 0

1 个答案:

答案 0 :(得分:0)

不要直接回答您的问题,但恐怕您可能会成为所谓的XY Problem的受害者:跳过这么多的障碍只是收集有关配置的信息是没有意义的。目标主机的IP堆栈-Windows提供了一种称为WMI的特殊方式来执行这些任务。

因此,您可以仅将此任务推迟到WMI支持的查询之一,而不必在目标主机上调用psexec.exe来调用cmd.exe。 / p>

我建议使用ipconfig.exeWin32_NetworkAdapter(或同时使用两者),具体取决于您实际需要的数据类型(NIC或路由数据的配置)。

使用github.com/StackExchange/wmi的工作示例是:

Win32_IP4RouteTable

如所示,它将查询在命令行上传递其名称的主机(或缺少主机名的主机)以获取NIC配置。

要获取路由数据,请注释掉第一条package main import ( "log" "os" "time" "github.com/StackExchange/wmi" ) type win32_NetworkAdapter struct { AdapterType string AdapterTypeID uint16 AutoSense bool Availability uint16 Caption string ConfigManagerErrorCode uint32 ConfigManagerUserConfig bool CreationClassName string Description string DeviceID string ErrorCleared bool ErrorDescription string GUID string Index uint32 InstallDate time.Time Installed bool InterfaceIndex uint32 LastErrorCode uint32 MACAddress string Manufacturer string MaxNumberControlled uint32 MaxSpeed uint64 Name string NetConnectionID string NetConnectionStatus uint16 NetEnabled bool NetworkAddresses []string PermanentAddress string PhysicalAdapter bool PNPDeviceID string PowerManagementCapabilities []uint16 PowerManagementSupported bool ProductName string ServiceName string Speed uint64 Status string StatusInfo uint16 SystemCreationClassName string SystemName string TimeOfLastReset time.Time } type win32_IP4RouteTable struct { Age int32 Caption string Description string Destination string Information string InstallDate time.Time InterfaceIndex int32 Mask string Metric1 int32 Metric2 int32 Metric3 int32 Metric4 int32 Metric5 int32 Name string NextHop string Protocol uint32 Status string Type uint32 } func main() { var compName string switch len(os.Args) { case 1: compName = "." case 2: compName = os.Args[1] default: log.Fatalf("usage: %s [COMPUTER]", os.Args[0]) } var dst []win32_NetworkAdapter //var dst []win32_IP4RouteTable q := wmi.CreateQuery(&dst, "") err := wmi.Query(q, &dst, compName) if err != nil { log.Fatalf("%#v\n", err) } for _, v := range dst { log.Printf("%#v\n", v) } } 语句,然后取消注释第二条。 希望你能明白。

相关的起点是thisthat