如何提取kubernetes pod命令执行结果属性

How to extract kubernetes pod command execution result attributes

我正在通过 client-Go 连接到 pod,我想获取文件目录的属性

func GetPodFiles(c *gin.Context)  {
    client, _ := Init.ClusterID(c)
    path := c.DefaultQuery("path", "/")
    cmd := []string{
        "sh",
        "-c",
        fmt.Sprintf("ls -l %s", path),
    }
    config, _ := Init.ClusterCfg(c)
    req := client.CoreV1().RESTClient().Post().
        Resource("pods").
        Name("nacos-0").
        Namespace("default").SubResource("exec").Param("container", "nacos")
    req.VersionedParams(
        &v1.PodExecOptions{
            Command: cmd,
            Stdin:   false,
            Stdout:  true,
            Stderr:  true,
            TTY:     false,
        },
        scheme.ParameterCodec,
    )

    var stdout, stderr bytes.Buffer
    exec, err := remotecommand.NewSPDYExecutor(config, "POST", req.URL())
    if err != nil {
        response.FailWithMessage(response.InternalServerError, err.Error(), c)
        return
    }
    err = exec.Stream(remotecommand.StreamOptions{
        Stdin:  nil,
        Stdout: &stdout,
        Stderr: &stderr,
    })
    if err != nil {
        response.FailWithMessage(response.InternalServerError, "Error obtaining file", c)
        return
    }

    fmt.Println(stdout.String())
}

执行结果输出

total 0
lrwxrwxrwx   1 root root   7 Jun  1  2018 bin -> usr/bin
drwxr-xr-x   5 root root 360 Feb 16 16:39 dev
lrwxrwxrwx   1 root root   8 Jun  1  2018 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Apr 11  2018 srv

期待结果

"data": [
        {
            "perm": "drwxr-xr-x",
            "mod_time": "2022-03-02 15:02:15",
            "kind": "d",
            "name": "temp",
            "size": ""
        },
]

有没有好的方法或者golang第三方库来处理。请告诉我。谢谢

在 Kubernetes pod 中,您可以执行 stat linux 命令而不是 ls 命令。

$ stat yourFileOrDirName

这个命令默认的输出是这样的:

  File: yourFileOrDirName
  Size: 346             Blocks: 0          IO Block: 4096   directory
Device: 51h/82d Inode: 40431       Links: 1
Access: (0755/drwxr-xr-x)  Uid: ( 1000/ username)   Gid: ( 1000/ groupname)
Access: 2022-03-02 11:59:07.384821351 +0100
Modify: 2022-03-02 11:58:48.733821177 +0100
Change: 2022-03-02 11:58:48.733821177 +0100
 Birth: 2021-12-21 11:12:05.571841723 +0100

但是你可以像这样调整它的输出:

$ stat --printf="%n,%A,%y,%s" yourFileOrDirName

其中 %n - 文件名,%A - 人类可读形式的权限位和文件类型,%y - 上次数据修改时间 human-readable,%s - 总大小,以字节为单位。您还可以选择任何字符作为分隔符而不是逗号。

输出将是:

yourFileOrDirName,drwxr-xr-x,2022-03-02 11:58:48.733821177 +0100,346

查看有关 stat 命令的更多信息 here

在你得到这样的输出后,如果你真的需要它,我相信你可以很容易地'convert'它到json格式。

此外,你可以运行这样的stat命令:

$ stat --printf="{\"data\":[{\"name\":\"%n\",\"perm\":\"%A\",\"mod_time\":\"%y\",\"size\":\"%s\"}]}" yourFileOrDirName

或者如@mdaniel 所建议的那样,由于该命令不包含任何 shell 变量,也不包含 ',更清晰的命令是:

stat --printf='{"data":[{"name":"%n","perm":"%A","mod_time":"%y","size":"%s"}]}' yourFileOrDirName

并获得 DIY json 输出:

{"data":[{"name":"yourFileOrDirName","perm":"drwxrwxr-x","mod_time":"2022-02-04 15:17:27.000000000 +0000","size":"4096"}]}