如何创建交互式命令执行

时间:2016-05-28 12:30:02

标签: go

我的问题是与exec.command的交互。我想在Windows上自动化RunAs。

我希望通过此应用程序在我的客户的计算机上启动其他应用程序(例如Ccleaner,防病毒eset online等...)。所以我创建了一个adminsys帐户,我想用这个帐户自动启动这些各种应用程序。

cmd := exec.Command("runas", user, nameProgram)

cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr

stdin, err := cmd.StdinPipe()
if err != nil {
    fmt.Println(err)
}
defer stdin.Close()
err = cmd.Start()
if err != nil {
    fmt.Println(err)
    return
}

time.Sleep(3 * time.Second)
io.WriteString(stdin, password)

err = cmd.Wait()
if err != nil {
    fmt.Println(err)
    return
}

这不起作用!

runas的错误。

Erreur de RUNAS : Impossible d’exécuter - C:\program.exe 
1326 : Le nom d’utilisateur ou le mot de passe est incorrect.

看起来他不认识密码。当我在命令提示符

中直接执行此操作时,此方法有效

gif

1 个答案:

答案 0 :(得分:0)

我没有运行Windows,你问题中的代码对我有效。因此,以下可能无法解决您的问题,但这是将字符串传递给命令的替代方法。

我创建了这个名为pass的基本命令,以断言密码的正确性:

func main() {

    fmt.Print("Enter your password please: ")
    reader := bufio.NewReader(os.Stdin)
    password, err := reader.ReadString('\n')
    if err != nil {
        fmt.Println("An error occurred while reading line")
    }

    // Remove the line break
    password = password[:len(password)-1]

    if password == "Secret pass" {
        fmt.Println("Success !")
    } else {
        fmt.Println("Failure !")
    }

}

现在,不要使用管道,而是将命令的Stdin设置为新读者:

func main() {
    cmd := exec.Command("pass")
    cmd.Stdin = strings.NewReader("Secret pass!\n")
    cmd.Stdout = os.Stdout
    _ = cmd.Run()
    // Failure

    cmd = exec.Command("pass")
    cmd.Stdin = strings.NewReader("Secret pass\n")
    cmd.Stdout = os.Stdout
    _ = cmd.Run()
    // Success
}

希望这有帮助。