upload_to_sftp.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import paramiko
  2. import sys
  3. import os
  4. def print_progress(transferred, total):
  5. progress = transferred / total * 100
  6. sys.stdout.write(f"\r传输进度:{progress:.2f}% ({transferred}/{total} 字节)")
  7. sys.stdout.flush()
  8. def sftp_upload(local_path, remote_path, host, port, username, password):
  9. try:
  10. # 创建一个SSH客户端对象
  11. ssh_client = paramiko.SSHClient()
  12. # 自动添加主机密钥
  13. ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  14. # 连接到SFTP服务器
  15. ssh_client.connect(hostname=host, port=port, username=username, password=password)
  16. # 创建一个SFTP客户端对象
  17. sftp_client = ssh_client.open_sftp()
  18. # 上传文件,并传入回调函数来显示传输进度
  19. sftp_client.put(local_path, remote_path, callback=print_progress)
  20. # 输出换行符,以便下一行正常显示
  21. print()
  22. print(f"文件成功上传")
  23. # 关闭SFTP连接
  24. sftp_client.close()
  25. # 关闭SSH连接
  26. ssh_client.close()
  27. except Exception as e:
  28. print(f"上传文件时发生错误: {e}")
  29. # 打印异常类型
  30. print(f"异常类型: {type(e)}")
  31. # 打印异常消息
  32. print(f"异常消息: {e}")
  33. # 打印异常的堆栈跟踪信息
  34. import traceback
  35. traceback.print_exc()
  36. if __name__ == "__main__":
  37. # 从命令行参数中获取本地文件路径、远程文件路径以及SFTP服务器相关信息
  38. if len(sys.argv) < 7:
  39. print("用法: python script.py <本地文件路径> <远程文件路径> <SFTP服务器地址> <端口> <用户名> <密码>")
  40. sys.exit(1)
  41. local_path = sys.argv[1]
  42. remote_path = sys.argv[2]
  43. host = sys.argv[3]
  44. port = int(sys.argv[4])
  45. username = sys.argv[5]
  46. password = sys.argv[6]
  47. # 检查本地文件是否存在
  48. if not os.path.exists(local_path):
  49. print(f"本地文件 {local_path} 不存在")
  50. sys.exit(1)
  51. # 上传文件到SFTP服务器
  52. sftp_upload(local_path, remote_path, host, port, username, password)