使用GoLang自动化“mysql_secure_installation”

时间:2017-11-02 02:57:17

标签: linux go buffer build-automation

第三个命令RunCommand("mysql_secure_installation");没有显示stdout / stderr缓冲区,命令也无法完成。键盘输入有效,但不会影响该过程。

ssh控制台上的mysql_secure_installation非常完美。

其他命令完美无缺。

package main

import (
    "fmt"
    "os/exec"
    "os"
    "bufio"
)

func main() {
    RunCommand("lsb_release -a"); //works perfect
    RunCommand("apt-get update"); //works perfect
    RunCommand("mysql_secure_installation"); //empty output and waiting for something!
}

func RunCommand(command string) {
    args := []string {"-c", command}
    executer := exec.Command("sh", args...)

    stdout, err := executer.StdoutPipe()
    if err != nil {
        fmt.Print("Error creating STDOUT pipe")
        os.Exit(1)
    }

    stderr, err := executer.StderrPipe()
    if err != nil {
        fmt.Print("Error creating STDERR pipe")
        os.Exit(1)
    }

    stdoutScanner := bufio.NewScanner(stdout)
    stdoutScanner.Split(bufio.ScanLines)
    go func() {
        for stdoutScanner.Scan() {
            out := stdoutScanner.Text();
            fmt.Printf("%s\n", out)
        }
    }()

    stderrScanner := bufio.NewScanner(stderr)
    stderrScanner.Split(bufio.ScanLines)
    go func() {
        for stderrScanner.Scan() {
            error := stderrScanner.Text()
            fmt.Printf("%s\n", error)
        }
    }()

    err = executer.Start()
    if err != nil {
        os.Exit(1)
    }

    err = executer.Wait()
    if err != nil {
        os.Exit(1)
    }
}

更新1:

主要问题在此链接中找到并被问为新问题:How to store STDOUT buffer of `mysql_secure_installation` to a file

更新2:

CentOS和Debian测试和缓冲工作完美,但在我的目标操作系统(Ubuntu 16.04 LTS)上它不起作用。

1 个答案:

答案 0 :(得分:0)

它挂起的原因是因为它仍在等待用户输入完成。

如评论中所述,mysql_secure_installation需要用户输入。如果要在没有用户输入的情况下运行它,可以尝试添加--use-default参数。

如果您想等待使用输入,请考虑阅读RunStart之间的差异。来自文档:

  

运行启动指定的命令并等待它完成。

  

开始启动指定的命令,但不等待它完成。

您可能需要尝试使用Run来允许用户输入程序。或者,您可以使用stdin将另一个字符串重定向到命令中,但这可能比它的价值更复杂。