我正在将一个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命令会自动处理。
答案 0 :(得分:1)
如果你想使用paramiko ssh到框中,你的python代码看起来类似于以下内容。
import paramiko
import copy
def ssh_server(server, username=username, password=password, pg_pass, ps_user, database):
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(server, username, password)
stdin, stdout, stderr = client.exec_command("PGPASSWORD=%s pg_dump -U %s %s" % (pg_pass, $pg_user, $database))
output = copy.deepcopy(stdout.readlines())
error = copy.deepcopy(stderr.readlines())
client.close()
if not error and output:
return stdout.readlines()
else:
print "An error occured\n%s" % error
return False
以下代码只是一个例子。当然,需要根据您的需要进行调整。 Paramiko支持RSA密钥和密码。如果你可以使用ssh无密码,那么你就不需要提供密码,而是输出密码参数。
答案 1 :(得分:0)