paramiko的sshclient与sftp

Den*_*nis 47 python ssh sftp paramiko

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

leo*_*luk 134

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()
Run Code Online (Sandbox Code Playgroud)

  • SCP和SFTP不一样! (4认同)
  • 可以使用上下文管理器来简化代码. (4认同)
  • 很好的答案。但是我要补充一点,`Transport` 和 `SFTPClient` 都实现了 `__enter__`/`__exit__` 接口,因此可以在上下文管理器中使用,例如 `with Transport((host, port)) 作为传输:` (2认同)
  • 虽然这个*有效*,但由于使用了低级“Transport”类,它绕过了主机密钥验证,这是一个安全缺陷,因为它使代码容易受到[中间人攻击]( https://en.wikipedia.org/wiki/Man-in-the-middle_attack)。更好的是使用正确的 Paramiko SSH API,“SSHClient”。请参阅[我的答案](/sf/ask/254459201/#66724076)。 (2认同)

Alo*_*man 8

如果您有 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
...
Run Code Online (Sandbox Code Playgroud)

  • 首先,这不是一个独立的答案,而只是对@leoluk 答案的评论。其次,如果你有`SSHClient`,你可以简单地执行`sftp = client.open_sftp()`。 (2认同)

小智 5

除了第一个答案(很好但取决于用户名/密码)之外,以下内容还显示了如何使用 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='.')
Run Code Online (Sandbox Code Playgroud)


Mar*_*ryl 5

接受的答案有效。但是通过使用低级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, remotepath2)
Run Code Online (Sandbox Code Playgroud)

有关验证主机密钥的详细信息,请参阅:
Paramiko“未知服务器”