Paramiko SFTPClient get() 和 put() 函数的通过/失败结果?

问题描述 投票:0回答:1

我正在使用 Paramiko 的 SFTPClient 类编写 Ansible 模块。我有以下代码片段

import paramiko
from ansible.module_utils.basic import *

def get_sftp_client(host, port, user, password):
  # Open a transport
  transport = paramiko.Transport((host,port))
  # Auth    
  transport.connect(None,user,password)
  # Get a client object
  sftp = paramiko.SFTPClient.from_transport(transport)
  return (transport, sftp)

def transfer_file(params):
  has_changed = False
  meta = {"upload": "not yet implemented"}
  user = params['user']
  password = params['password']
  host = params['host']
  port = params['port']
  direction = params['direction']
  src = params['src']
  dest = params['dest']

  transport, sftp = get_sftp_client(host, port, user, password)

  stdout = None
  stderr = None
  if direction == 'download':
    sftp.get(src, dest)
  else:
    sftp.put(src, dest)

  meta = {
    "source": src,
    "destination": dest,
    "direction": direction,
    "stdout": stdout,
    "stderr": stderr
  }

  # Close
  if sftp: sftp.close()
  if transport: transport.close()
  return (has_changed, meta)

def main():
  fields = {
    "user": {"required": True, "type": "str"},
    "password": {"required": True, "type": "str", "no_log": True},
    "host": {"required": True, "type": "str"},
    "port": {"type": "int", "default": 22},
    "direction": {
      "type": "str",
      "choices": ["upload", "download"],
      "default": "upload",
    },
    "src": {"type": "path", "required": True},
    "dest": {"type": "path", "required": True},
  }

  module = AnsibleModule(argument_spec=fields)

  # Do the work
  has_changed, result = transfer_file(module.params)

  module.exit_json(changed=has_changed, meta=result)

if __name__ == '__main__':
    main()

如何捕获

get()
put()
函数的通过/失败结果?文档没有提到
get()
的返回值,并且
put()
的返回值是一个
SFTPAttribute
类,我不需要它。我只想知道交易是否通过或失败,如果失败,则获取错误。谢谢。

python-3.x ansible paramiko
1个回答
0
投票

SFTPClient.put
.get
出错时抛出异常。

如果他们不抛出,则传输成功。

© www.soinside.com 2019 - 2024. All rights reserved.