使用Golang在容器内执行shell命令
func ExecShellScript(podName, namespace string) {
path := "/tmp/"
clientSet := GetKubeClient()
req := clientSet.CoreV1().RESTClient().Post().
Resource("pods").Name(podName).Namespace(namespace).SubResource("exec").
VersionedParams(&corev1.PodExecOptions{
Container: "nginx",
Command: []string{"sh"},
Stdin: true,
Stdout: true,
Stderr: true,
TTY: false,
}, scheme.ParameterCodec)
executor, err := remotecommand.NewSPDYExecutor(GetKubeConfig(), "POST", req.URL())
if err != nil {
fmt.Println(err.Error())
}
//获取文件名称
lsOut := &bytes.Buffer{}
var lsCmd = "find " + path + ` -type f | grep -Eo '\.[^.]+$' | sort | uniq -c`
var stderr = &bytes.Buffer{}
if err = executor.Stream(remotecommand.StreamOptions{
Stdin: strings.NewReader(lsCmd),
Stdout: lsOut,
Stderr: stderr,
}); err != nil {
fmt.Println(err.Error())
}
// 读取输出结果
output := lsOut.String()
// 输出文件内容
fmt.Println(output)
//读取文件
catOut := &bytes.Buffer{}
var catCmd = `cat ` + path + `*.txt |grep - |awk '{print $2}'|tr '\n' ' '`
var catStderr = &bytes.Buffer{}
if err = executor.Stream(remotecommand.StreamOptions{
Stdin: strings.NewReader(catCmd),
Stdout: catOut,
Stderr: catStderr,
}); err != nil {
fmt.Println(err.Error())
}
}