【问题标题】:Python script to copy file and directory from one remote server to another remote server用于将文件和目录从一台远程服务器复制到另一台远程服务器的 Python 脚本
【发布时间】:2020-08-31 22:41:52
【问题描述】:

我正在本地机器上运行一个 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'

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

【问题讨论】:

    标签: python ssh sftp paramiko pysftp


    【解决方案1】:

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


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

    通常,您需要将文件从第一台服务器下载到本地临时目录。然后将它们上传到第二个服务器。
    Python PySFTP transfer files from one remote server to another remote server


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

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

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

    【讨论】:

      【解决方案2】:

      从您的错误消息中,您能否确认源目录/home/sovith/build(或/home/bgnanasekaran/nfmbuild)存在?

      一个好的做法是在调用sftp.put_r() 之前检查一下,即:

      from pathlib import Path
      
      d = Path('/home/sovith/build')
      if d.exists():
        sftp.put_r('/home/sovith/build' , '/var/tmp')
      else:
        print("Your source doesn't exist")
      

      【讨论】:

      • 它的“/home/sovith/build”
      • @SovithKothari 谢谢!即使我的回答没有抓住你的问题的重点,我也已经编辑了代码:(
      猜你喜欢
      • 2013-12-03
      • 2016-05-03
      • 2019-08-15
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      相关资源
      最近更新 更多