我试图将大文件(~1.5G)从CentOS6.6复制到另一个Centos6.6
(python 2.7.8,paramiko 1.11.0)
使用简单的scp时,文件以大约40MB / s的速度复制,使用paramiko时,文件的速度降至2MB / s
这是执行复制的代码:
def create_paramiko_sftp(self, ip, port, username, password):
transport = paramiko.Transport((ip, port))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
return sftp
def read_in_chunks(self, file_object, chunk_size=(4 << 20)):
# generator that yields the data in chunks
while True:
data = file_object.read(chunk_size)
if not data:
break
yield data
def copy_file2(self, ip, src, dest):
sftp = self.create_paramiko_sftp(ip, 22, <usrname>, <psswd>)
i = 0
start_time = time.time()
f = open(src, 'rb')
op = sftp.open(dest, mode='w+')
for piece in self.read_in_chunks(f):
i += 1
# print '\r{0}'.format(i),
op.write(piece)
op.close()
f.close()
sftp.close()
self.Log("--- %s seconds ---" % (time.time() - start_time), INFO)
可以看出,我正在以块的形式复制文件。是否有可能需要以不同的方式配置其中一个系统端口才能达到相同的速度?
我环顾四周,没有找到解决问题的答案答案 0 :(得分:0)
我在下载类似的大量数据时遇到了同样的问题。我无法加快速度,但发现subprocess
模块可以为我提供更好的解决方案。它允许执行shell命令。这是一个例子:
import subprocess
command = 'ssh user@host "tar -cf - ~/foo" > foo.tar'
p = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
# Print command line output
for line in p.stdout:
print(line.decode("utf-8").rstrip())
# Wait for command line process to finish before proceeding
p.communicate()
您可以将命令更改为您将在命令行中使用的任何命令。我甚至使用cmder在Windows 10上成功运行了这个。您可以使用scp,rsync等替换tar命令。
我无法使用用户名和密码进行此操作,因此我生成了一个SSH密钥。对于那些不知道那是什么的人(我没有),这里有一个摘要。
使用命令行工具ssh-keygen
,您可以创建公钥和私钥,以便您无需提供密码即可对远程计算机进行身份验证。示例命令是ssh-keygen -t rsa
。 This教程有更多信息。
在本地生成密钥后,将公钥复制到远程计算机。这可以通过shell命令(ssh-copy-id user@host
)完成,也可以将本地计算机上的公钥(~/.ssh/id_rsa.pub
)粘贴到远程计算机上的~/.ssh/authorized_keys
中。如果该目录和文件不存在,请执行以下命令:
mkdir ~/.ssh
chmod 0700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 0644 ~/.ssh/authorized_keys
nano ~/.ssh/authorized_keys
打开authorized_keys
文件后,将公钥粘贴到其中,然后保存( Ctrl + O )并退出( Ctrl < / kbd> + X )文件。下次在该计算机上使用SSH时,您不必使用密码。