paramiko的sshclient与sftp

时间:2010-09-03 11:05:49

标签: python sftp paramiko

如何在远程服务器上通过SSHClient进行SFTP传输?我有一个本地主机和两个远程主机。远程主机是备份服务器和Web服务器。我需要在备份服务器上找到必要的备份文件,并通过sftp将其放在Web服务器上。如何让paramiko的SFTP传输与paramiko的SSHClient一起工作?

4 个答案:

答案 0 :(得分:129)

paramiko.SFTPClient

示例:

import paramiko
paramiko.util.log_to_file('/tmp/paramiko.log')

# Open a transport

host = "example.com"
port = 22
transport = paramiko.Transport((host, port))

# Auth

password = "foo"
username = "bar"
transport.connect(username = username, password = password)

# Go!

sftp = paramiko.SFTPClient.from_transport(transport)

# Download

filepath = '/etc/passwd'
localpath = '/home/remotepasswd'
sftp.get(filepath, localpath)

# Upload

filepath = '/home/foo.jpg'
localpath = '/home/pony.jpg'
sftp.put(localpath, filepath)

# Close

sftp.close()
transport.close()

答案 1 :(得分:4)

接受的答案有效。但是通过使用低级 Transport 类,它绕过了主机密钥验证,这是一个安全漏洞,因为它使代码容易受到 Man-in-the-middle attacks 的影响。

最好使用正确的 Paramiko SSH API,即 SSHClient,它可以验证主机密钥:

import paramiko
paramiko.util.log_to_file("paramiko.log")

ssh = paramiko.SSHClient()
ssh.connect(host, username='user', password='password')
# or 
# key = paramiko.RSAKey.from_private_key_file('id_rsa')
# ssh.connect(host, username='user', pkey=key)

sftp = ssh.open_sftp()

sftp.get(remotepath, localpath)
# or
sftp.put(localpath, remotepath2)

有关验证主机密钥的详细信息,请参阅:
Paramiko "Unknown Server"

答案 2 :(得分:2)

如果您拥有SSHClient,也可以使用open_sftp()

import paramiko


# lets say you have SSH client...
client = paramiko.SSHClient()

sftp = client.open_sftp()

# then you can use upload & download as shown above
...

答案 3 :(得分:0)

除了第一个很棒但取决于用户名/密码的答案之外,以下内容还显示了如何使用 ssh 密钥:

from paramiko import Transport, SFTPClient, RSAKey
key = RSAKey(filename='path_to_my_rsakey')
con = Transport('remote_host_name_or_ip', 22)
con.connect(None,username='my_username', pkey=key)
sftp = SFTPClient.from_transport(con)
sftp.listdir(path='.')