使用docker-c选项在shell脚本中以单行形式运行if语句



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

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

这怎么能作为一行运行?

您可以将所有这些逻辑抽象到更高级别的应用程序中。如果不能做到这一点,请编写一个标准的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'

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

最新更新