背景
要执行的脚本是交互式的, 比如要输入用户密码, 希望自动输入,有python 实现,参考: python 使用 subprocess 实现交互式命令的非交互式执行
本地描述Go的实现
过程
代码
要执行的脚本
#!/bin/bash
read -t 30 -p "Please input your username:" username
echo -e "\n"
echo "username is $username"
read -s -t 30 -p "Please input your Age:" age
echo -e "\n"
echo "Age is $age"
read -n 1 -t 30 -p "Please input your gender[M/F]" gender
echo -e "\n"
echo "gender is $gender"
需要输入, 用户名, 密码和性别
Go 使用 exec.cmd 调用
package main
import (
"fmt"
"io"
"os"
"os/exec"
)
func main() {
//调用执行的脚本
subProcess := exec.Command("./test.sh")
// 声明stdin, 用作输入
stdin, err := subProcess.StdinPipe()
if err != nil {
fmt.Println(err)
}
// 结束后关闭stdin
defer stdin.Close()
// 输出执行过程
subProcess.Stdout = os.Stdout
subProcess.Stderr = os.Stderr
fmt.Println("START")
// 使用 Start 启动, 非阻塞式执行
if err = subProcess.Start(); err != nil {
fmt.Println("An error occured: ", err)
}
// 输入参数
io.WriteString(stdin, "Talon\n")
io.WriteString(stdin, "18\n")
io.WriteString(stdin, "M\n")
// 等待执行完毕
subProcess.Wait()
fmt.Println("END")
}