Paramiko的SSHClient与SFTP

103 投票
5 回答
196161 浏览
提问于 2025-04-16 03:40

我想知道怎么通过SSHClient在远程服务器上实现SFTP传输。我有一台本地电脑和两台远程服务器,分别是备份服务器和网页服务器。我需要在备份服务器上找到需要的备份文件,然后通过SFTP把它放到网页服务器上。我该怎么让Paramiko的SFTP传输和Paramiko的SSHClient一起工作呢?

5 个回答

7

如果你有一个 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
...
50

被接受的答案虽然“有效”,但它使用了低级的 Transport 类,这样就绕过了主机密钥的验证,这其实是个安全隐患,因为这样代码就容易受到中间人攻击

更好的做法是使用正确的 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, remotepath)

关于验证主机密钥的详细信息,可以查看:
Paramiko "未知服务器"

225

paramiko.SFTPClient

示例用法:

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

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

# Auth    
username,password = "bar","foo"
transport.connect(None,username,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
if sftp: sftp.close()
if transport: transport.close()

撰写回答