首页 > 解决方案 > 在 pexpect 中切换交互和非交互模式

问题描述

我正在使用 pexpect 将文件上传到 SFTP 服务器。对于第一次访问服务器,我收到消息 The authenticity of host..can't be established.Are you sure you want to continue connecting (yes/no)?

我希望用户与之交互并回答是/否。但是,当用户说是时,我希望关闭交互模式,然后从我的脚本中获取密码,而不是提示用户。这可能使用 pexpect 吗?

p = spawn('XXXXXXXX')
password = 'XXXXXXXXx'
out=p.expect(['(?i)password:', '(?i)Are you sure you want to continue connecting (yes/no)?']

if out == 1:
   p.interact()
   
# Script should continue to send password and upload file

但这进入交互模式并且不会回到脚本

请。注意 - 我在终端中运行这个 python 脚本。

如果不是 pexpect,请提出一个不基于 paramiko、pysftp 的解决方案

标签: pythonsubprocesssftppexpect

解决方案


检查pexpect 文档

交互(escape_character='\x1d',input_filter=None,output_filter=None)[来源]

这将子进程的控制权交给了交互式用户(键盘上的人)。击键被发送到子进程,并打印子进程的 stdout 和 stderr 输出。这只是将子标准输出和子标准错误回显到真正的标准输出,并将真正的标准输入回显到子标准输入。当用户键入 escape_character 时,此方法将返回 None。

您可以将转义字符传递给p.interact(),之后将禁用交互模式。如果所有用户需要输入的是yes,那么您可以将转义字符设置为a(或其他一些没有出现在“yes”或“no”中的字母),如下所示:

p.interact('a')

推荐阅读