Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 帕拉米科';带SFTP的s SSHClient_Python_Ssh_Sftp_Paramiko - Fatal编程技术网

Python 帕拉米科';带SFTP的s SSHClient

Python 帕拉米科';带SFTP的s SSHClient,python,ssh,sftp,paramiko,Python,Ssh,Sftp,Paramiko,如何通过远程服务器上的SSHClient进行SFTP传输?我有一个本地主机和两个远程主机。远程主机是备份服务器和web服务器。我需要在备份服务器上找到必要的备份文件,并通过SFTP将其放在web服务器上。如何使Paramiko的SFTP传输与Paramiko的SSHClient? 示例用法: import paramiko paramiko.util.log_to_file("paramiko.log") # Open a transport host,port = "example.com"

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

示例用法:

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()

如果您有SSHClient,还可以使用
open\u sftp()


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

公认的答案是有效的。但由于它使用了低级的
传输
类,它绕过了主机密钥验证,这是一个安全缺陷,因为它使代码容易受到攻击

更好的方法是使用正确的Paramiko SSH API,即验证主机密钥的:

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)

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

没错,但这会创建从本地主机到web或备份的传输。我需要从备份到web的sftp,并从本地主机启动脚本。Bot必须这样做:“sshadmin@backup.server;scp backup.fileadmin@web.server:/home/admin/tmp”。我是如何理解scp的?paramiko库不支持scp,但它支持sftp,我想制作从远程服务器到远程服务器的sftp隧道?不是从我的本地主机。现在有一个使用paramiko scp和SFTP的scp实现是不一样的!回答得很好。然而,我要补充的是,
Transport
SFTPClient
都实现了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
接口,因此可以在上下文管理器中使用,例如,
将传输((主机,端口))作为传输:
,而这是有效的,它绕过了主机密钥验证,这是一个安全缺陷,因为它使代码容易受到攻击。更好的方法是使用正确的paramikosshapi,即
SSHClient
。首先,这不是一个独立的答案,只是对@leoluk答案的评论。其次,如果您有
SSHClient
,只需执行
sftp=client.open\u sftp()
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)