BASH输出查询到另一个bash脚本的结果,然后执行第二个脚本

时间:2015-06-16 19:55:38

标签: bash postgresql shell

我对bash脚本编写完全陌生。我有一个生成输出的查询。我需要将该输出添加到另一个bash脚本,然后运行第二个bash脚本。之后,继续执行主脚本中的下一步。我花了几个小时在互联网上搜索后把它放在一起。我知道它远非正确,但我被困住了。

#!/bin/bash

<<EOF

\c database;

COPY (
select 'cp ./branding/'||value||' ./customization/'||replace(value,'curric-mobile:','') from branding_resource
where media_type like 'image%'
and name like 'curric-mobile%'
and account_uid = 'b1b08a9e-9310-41ce-b2cb-6b4d590c8104')
TO '/tmp/t1.sh';
EOF

if [[ -f /tmp/t1.sh ]]

chmod +x /tmp/t1.sh

/tmp/t1.sh | tee -a /tmp/t1.log

脚本的输出应如下所示:

cp ./branding/curric-mobile:c9bec2f6-0b13-4243-8176-d0dc27774fd9.png ./customization/c9bec2f6-0b13-4243-8176-d0dc27774fd9.png
cp ./branding/curric-mobile:6f3d3554-03bc-4771-9069-60c82ebc64c5.jpg ./customization/6f3d3554-03bc-4771-9069-60c82ebc64c5.jpg
cp ./branding/curric-mobile:f32aae31-5ef6-4a1c-893f-8d7bbd560707.png ./customization/f32aae31-5ef6-4a1c-893f-8d7bbd560707.png
cp ./branding/curric-mobile:4a1c88a8-60c0-4878-9de2-fa141fec3391.png ./customization/4a1c88a8-60c0-4878-9de2-fa141fec3391.png
...

谢谢!

1 个答案:

答案 0 :(得分:0)

这仍然被打破,因为它需要修改查询以排除包含\x01\x02个字符的值,但它更接近合理的值:

#!/bin/bash

while IFS=$'\x02' read -r -d $'\x01' -a fields; do
  cp -- "./branding/${fields[0]}" "./customization/${fields[0]#curric-mobile:}"
done < <(psql -q -t -R $'\x01' -F $'\x02' --pset='format=unaligned' <<'EOF'
  SELECT value
  FROM branding_resource
  WHERE media_type like 'image%'
    AND name like 'curric-mobile%'
    AND account_uid = 'b1b08a9e-9310-41ce-b2cb-6b4d590c8104'
EOF
)

如果您未设置PGDATABASEPGUSER和其他相关环境变量,请根据需要添加包含相应数据的命令行参数。

请注意,我们根本不尝试从数据库内部生成shell脚本,而只是提取数据(以明确定义的格式),并根据该数据运行命令。

这可以防止shell注入攻击,而另一种方法则非常容易受到攻击。即使value中的branding_resource列包含$(rm -rf /)之类的内容,也不存在执行该代码的风险。