使用pexpect模块进行SFTP

3 投票
1 回答
3144 浏览
提问于 2025-04-17 07:45

我正在尝试使用pexpect模块通过SFTP传输一个文件。

sftp_opts = ['-o', 'Port=%s' % port,
                 '-o', 'UserKnownHostsFile=%s' % known_hosts_file,
                 '-o', 'PasswordAuthentication=yes',
                 '%s@%s' % (user, host)]
    p = pexpect.spawn('sftp', sftp_opts)

    try:
      p.expect('(?i)password:')
      x = p.sendline(password)
      x = p.expect('sftp>')
      x = p.sendline('cd ' + remote_dir)
      x = p.expect('sftp>')
      x = p.sendline('put ' + filename)
      x = p.expect('sftp>')
      x = p.isalive()
      x = p.close()
      retval = p.exitstatus
    except pexpect.EOF:
      print('SFTP file transfer failed due to premature end of file.')
      return False
    except pexpect.TIMEOUT:
      print('SFTP file transfer failed due to timeout.')
      return False

看起来我能够通过SSH连接并进行身份验证,但返回值总是1(退出状态),文件没有被成功传输。

我是不是漏掉了什么?

如果我尝试让程序等待p(用p.wait()而不是p.close())- 它永远不会返回。

1 个回答

2

总结一下作为回答:

  • 开启调试日志,这样可以更清楚地了解哪里出错了;来自David K. Hess

  • 使用pexpect,但要自动化scp,而不是sftp;更好的方法是使用ssh密钥;来自jornam

  • 使用paramiko ssh库中的sftp功能;来自ephemient

撰写回答