首页 > 解决方案 > 用于将文件和目录从一台远程服务器复制到另一台远程服务器的 Python 脚本

问题描述

我在本地机器上运行 python 脚本 - ssh.py 将文件和目录从一个远程服务器(ip = 35.189.168.20)传输到另一台远程服务器(ip = 10.243.96.94)

这就是我的代码的样子:

HOST = "35.189.168.207"
USER = "sovith"
PASS = "xxx"
destHost = "10.243.96.94"
destUser = "root"
destPass = "xxx"

#SSH Connection
client1=paramiko.SSHClient()
client1.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client1.connect(HOST,username=USER,password=PASS)

#SFTP inside SSH server connection
with pysftp.Connection(host=destHost, username=destUser, password=destPass) as sftp:
    #put build directory - sftp.put_r(source, destination)
    sftp.put_r('/home/sovith/build' , '/var/tmp') 
    sftp.close()
client1.close()

让我告诉你所有目录路径和一切都是正确的。我只是觉得代码内部存在一些逻辑错误。执行后我得到的输出是:

Traceback (most recent call last):
  File "ssh.py", line 108, in <module>
    func()
  File "ssh.py", line 99, in func
    sftp.put_r('/home/sovith/nfmbuild' , '/var/tmp')
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pysftp/__init__.py", line 427, in put_r
    os.chdir(localpath)
FileNotFoundError: [Errno 2] No such file or directory: '/home/sovith/build'

您能否纠正我的代码中的错误或建议任何更好的方法来完成任务。简单来说,我想要一个脚本在两个远程服务器之间复制文件和目录。

标签: pythonsshsftpparamikopysftp

解决方案


那是不可能的。不是你这样做的方式。您打开与一台远程服务器的连接这一事实不会使以下代码神奇地工作,就好像它是在该服务器上执行的一样。它仍然在本地机器上运行。所以代码正在尝试上传本地文件(不存在)。


实际上没有办法在本地机器的两个远程 SFTP 服务器之间传输文件。

通常,您需要将文件从第一台服务器下载到本地临时目录。然后将它们上传到第二个服务器。
请参阅Python PySFTP 将文件从一台远程服务器传输到另一台远程服务器


另一种选择是使用 SSH 连接到一个远程服务器,然后在服务器上运行 SFTP 客户端以将文件传输到/从第二个服务器传输。

但这不是从一个 SFTP 服务器复制到另一个 SFTP 服务器。这是从一台 SSH 服务器复制到 SFTP 服务器。您需要 SSH 访问权限,仅 SFTP 访问权限是不够的。

要执行远程 SSH 服务器的命令,请使用 pysftp Connection.execute。虽然使用 pysftp 在服务器上执行命令有点矫枉过正。您可以直接使用 Paramiko:
Python Paramiko - 运行命令
(pysftp 只是 Paramiko 的包装器,具有更高级的 SFTP 功能)


推荐阅读