postgresql 在没有sudo的bash脚本中运行UNIX命令的语义正确的方法?

qgzx9mmu  于 2023-03-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(104)

我有一个.sh脚本,可以运行PostgreSQL DB的更改,并提供这些更改的报告。作为脚本的输出,会生成一个report.csv文件。服务器有多个用户,这些用户只允许读取该文件。在脚本结束时,我想压缩并存档它(.csv和.zip文件都是指定的结果)。这些指令需要使用sudo权限才能运行。我的问题是如何安排shell命令语义正确,使我尽可能少地使用sudo?
我不能以sudo的方式运行整个脚本,因为它使用psql访问,这会将运行数据库访问的用户更改为root。

#!/bin/bash
sudo chmod 440 /tmp/$REPORT_FILE

# Move to archive folder and rename
sudo mv /tmp/$REPORT_FILE/$ARCHIVE_DIR$/$REPORT_NAME

cd $ARHIVE_DIR
sudo zip ${REPORT_ZIP_NAME} {REPORT_NAME}
sudo chmod 440 ${REPORT_ZIP_NAME}
rm $REPORT_NAME
pcww981p

pcww981p1#

为了将sudo调用限制为一个,你可以创建一个临时目录,做你的事情,然后移动文件:

#!/bin/bash

REPORT_NAME=myReportName
REPORT_ZIP_NAME=something.zip
ARCHIVE_DIR=/some/path

tempdir=$(mktemp -d)
chmod 700 "$tempdir"

# ... "$REPORT_FILE" is created in "$tempdir" one way or another ...

pushd "$tempdir" > /dev/null

mv "$REPORT_FILE" "$REPORT_NAME"
zip "$REPORT_ZIP_NAME" "$REPORT_NAME"

chmod 440 *
sudo mv * "$ARCHIVE_DIR"/

popd > /dev/null

rmdir "$tempdir"

**旁注:**你应该总是用双引号括起你的var展开式;此外,使用大写的局部变量名是有风险的,因为它可能与外部或内置变量冲突(例如REPLYSECONDS等)。

im9ewurl

im9ewurl2#

一种常见的安排是将整个脚本作为sudo运行,但在运行完成后将其特权删除。

#!/bin/bash

# Exit with an error code if one of these commands fail
set -e

chmod 440 /tmp/"$REPORT_FILE"
# this line had an error; did you mean this?
mv /tmp/"$REPORT_FILE" "/$ARCHIVE_DIR$/$REPORT_NAME"

cd "$ARHIVE_DIR"
# I'm guessing REPORT_NAME was supposed to be $REPORT_NAME?
zip "$REPORT_ZIP_NAME" "$REPORT_NAME"
chmod 440 "$REPORT_ZIP_NAME"
rm "$REPORT_NAME"

exec su - "$SUDO_USER" -c 'psql blah blah ...'

set -e是一个有点杂七杂八的东西,但我不想为每个需要特权访问的命令添加显式的错误检查。
另请注意When to wrap quotes around a shell variable

相关问题