【问题标题】:Running an if statement in shell script as a single line with docker -c option使用 docker -c 选项在 shell 脚本中将 if 语句作为单行运行
【发布时间】:2020-07-23 03:20:35
【问题描述】:

我需要在 docker run -it image_name -c \bin\bash --script 和下面的 --script 中将下面的代码作为单行运行 (dir 和 dockerImageName 为参数)

'''cd ''' + dir+ ''' \
&& if make image ''' + dockerImageName''' 2>&1 | grep -m 1 "No rule to make target"; then
exit 1
fi'''

这怎么可以单行运行?

【问题讨论】:

    标签: shell docker dockerfile sh


    【解决方案1】:

    您可以将所有这些逻辑抽象到更高级别的应用程序中。如果您不能这样做,请编写一个标准的 shell 脚本并将其 COPY 到您的映像中。

    三重引号看起来像 Python 语法。您可以将其分为三个部分:

    1. cd $dir 部分指定子进程的工作目录;
    2. make ... 是实际运行的命令;
    3. 您正在检查其输出是否存在某种情况。

    在 Python 中,您可以使用一组参数调用 subprocess.run(),并在应用程序级别指定这些不同的东西。 shell 不会重新解释参数数组,因此可以保护您免受此特定安全问题的影响。你可能会跑:

    completed = subprocess.run(['make', 'image', dockerImageName],
                               cwd=dir,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.STDOUT)
    if 'No rule to make target' in completed.stdout:
      ...
    

    如果您需要以 shell 脚本的形式执行此操作,请将其作为适当的 shell 脚本执行并确保再次引用您的参数可以保护您。

    #!/bin/sh
    set -e
    cd "$1"
    if make image "$2" 2>&1 | grep -m 1 "No rule to make target"; then
      exit 1
    fi
    

    您永远不应该通过以您所展示的方式组合字符串来构建命令行。这使您容易受到 shell 注入攻击。特别是如果攻击者知道用户有运行docker命令的权限,他们可以设置

    dir = '.; docker run --rm -v /:/host busybox cat /host/etc/shadow'
    

    并获得一份他们可以在闲暇时破解的加密密码文件。一旦攻击者使用这种技术获得对主机文件系统的无限根级读/写访问权限,几乎任何其他事情都是可能的。

    【讨论】:

    • 我认为没有理由用 set -e 替换单个 && 以确保以下 if 语句仅在 cd 成功时运行。
    猜你喜欢
    • 2012-03-15
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多