使用pexpect模块进行SFTP
我正在尝试使用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