upload_to_sftp.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. try:
  20. sftp_client.stat(remote_path)
  21. print(f"远程文件 {remote_path} 已存在")
  22. except FileNotFoundError:
  23. # 获取远程路径中的目录部分
  24. remote_dir = os.path.dirname(remote_path)
  25. # 创建远程目录
  26. if remote_dir:
  27. try:
  28. sftp_client.stat(remote_dir)
  29. except FileNotFoundError:
  30. sftp_client.mkdir(remote_dir)
  31. print(f"已在远程服务器上创建目录 {remote_dir}")
  32. # 创建远程文件
  33. sftp_client.open(remote_path, 'w').close()
  34. print(f"已在远程服务器上创建文件 {remote_path}")
  35. # 上传文件,并传入回调函数来显示传输进度
  36. sftp_client.put(local_path, remote_path, callback=print_progress)
  37. # 输出换行符,以便下一行正常显示
  38. print()
  39. print(f"文件成功上传")
  40. # 关闭SFTP连接
  41. sftp_client.close()
  42. # 关闭SSH连接
  43. ssh_client.close()
  44. except Exception as e:
  45. print(f"上传文件时发生错误: {e}")
  46. # 打印异常类型
  47. print(f"异常类型: {type(e)}")
  48. # 打印异常消息
  49. print(f"异常消息: {e}")
  50. # 打印异常的堆栈跟踪信息
  51. import traceback
  52. traceback.print_exc()
  53. if __name__ == "__main__":
  54. # 从命令行参数中获取本地文件路径、远程文件路径以及SFTP服务器相关信息
  55. if len(sys.argv) < 7:
  56. print("用法: python script.py <本地文件路径> <远程文件路径> <SFTP服务器地址> <端口> <用户名> <密码>")
  57. sys.exit(1)
  58. local_path = sys.argv[1]
  59. remote_path = sys.argv[2]
  60. host = sys.argv[3]
  61. port = int(sys.argv[4])
  62. username = sys.argv[5]
  63. password = sys.argv[6]
  64. # 检查本地文件是否存在
  65. if not os.path.exists(local_path):
  66. print(f"本地文件 {local_path} 不存在")
  67. sys.exit(1)
  68. # 上传文件到SFTP服务器
  69. sftp_upload(local_path, remote_path, host, port, username, password)