我对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
...
谢谢!
答案 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
)
如果您未设置PGDATABASE
,PGUSER
和其他相关环境变量,请根据需要添加包含相应数据的命令行参数。
请注意,我们根本不尝试从数据库内部生成shell脚本,而只是提取数据(以明确定义的格式),并根据该数据运行命令。
这可以防止shell注入攻击,而另一种方法则非常容易受到攻击。即使value
中的branding_resource
列包含$(rm -rf /)
之类的内容,也不存在执行该代码的风险。