如何在远程服务器上通过SSHClient进行SFTP传输?我有一个本地主机和两个远程主机。远程主机是备份服务器和Web服务器。我需要在备份服务器上找到必要的备份文件,并通过sftp将其放在Web服务器上。如何让paramiko的SFTP传输与paramiko的SSHClient一起工作?
答案 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='.')