SSH进入服务器,运行命令并将其输出保存到Python中的变量

时间:2014-12-30 21:23:16

标签: python bash ssh

我正在将一个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_LOCATIONLOCAL_DIRpg_passpg_userdatabase都是在Python程序中定义的。

转义远程shell的变量,尤其是pg_pass非常重要。这是由printf '%q'在bash代码中处理的。

将上述bash代码翻译成Python的最佳方法是什么?

编辑:另一个警告,身份验证由公钥处理,而不是密码。当然,ssh shell命令会自动处理。

2 个答案:

答案 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)

  

将上述bash代码翻译成Python的最佳方法是什么?

这个问题的答案往往是:使用plumbum

借用docs,这应该足以轻松演示如何使用它(以及它有多棒),你可以这样做:

rem = SshMachine("hostname", user = "john", keyfile = "/path/to/idrsa")
output = rem.which("ls")