【发布时间】:2014-12-31 05:48:22
【问题描述】:
我正在将一个 bash 程序翻译成 Python,并且已经完成了所有工作。这是 bash 代码,它只是通过 SSH 连接到服务器,执行 PostgreSQL 数据库转储,如果没有错误,则将其保存到文件中。
output="$(ssh "$SSH_LOCATION" bash <<< "$(printf 'PGPASSWORD=%q pg_dump -U %q %q' "$pg_pass" "$pg_user" "$database")")"
if [[ $? -ne 0 ]]
then
echo "$output"
echo "An error occurred while dumping the database"
exit $?
else
echo "$output" > ~/"$LOCAL_DIR"/"$database"
fi
变量SSH_LOCATION、LOCAL_DIR、pg_pass、pg_user和database都是在Python程序中定义的。
对远程 shell 的变量进行转义,尤其是 pg_pass,非常重要。这是由printf '%q' 在 bash 代码中处理的。
将上述 bash 代码转换为 Python 的最佳方法是什么?
编辑:还有一个警告,身份验证是由公钥处理的,而不是密码。当然,ssh shell 命令会自动处理这个问题。
【问题讨论】:
-
我想说“把子进程扔到这里”。但如果被问到“到底是怎么做到的”,我真的会不知所措
-
@inspectorG4dget 我可以做
subproccess.Popen(['bash', '-c', """BASH CODE"""]),并从 python 提供所有变量。不过感觉有点太老套了。 -
也可以考虑pexpect