在远程计算机上,我只是使用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
答案 0 :(得分:0)
不要直接回答您的问题,但恐怕您可能会成为所谓的XY Problem的受害者:跳过这么多的障碍只是收集有关配置的信息是没有意义的。目标主机的IP堆栈-Windows提供了一种称为WMI的特殊方式来执行这些任务。
因此,您可以仅将此任务推迟到WMI支持的查询之一,而不必在目标主机上调用psexec.exe
来调用cmd.exe
。 / p>
我建议使用ipconfig.exe
或Win32_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)
}
}
语句,然后取消注释第二条。
希望你能明白。