python - 在 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 的解决方案
解决方案
检查pexpect 文档:
交互(escape_character='\x1d',input_filter=None,output_filter=None)[来源]
这将子进程的控制权交给了交互式用户(键盘上的人)。击键被发送到子进程,并打印子进程的 stdout 和 stderr 输出。这只是将子标准输出和子标准错误回显到真正的标准输出,并将真正的标准输入回显到子标准输入。当用户键入 escape_character 时,此方法将返回 None。
您可以将转义字符传递给p.interact()
,之后将禁用交互模式。如果所有用户需要输入的是yes
,那么您可以将转义字符设置为a
(或其他一些没有出现在“yes”或“no”中的字母),如下所示:
p.interact('a')
推荐阅读
- angular8 - 如何从父目录中的服务调用 http post 方法
- r - 我正在尝试为我的数据集中的每一行创建一个单独的文档术语矩阵。我已将以下代码应用于每个
- android - 如何在片段中访问 SQLite 数据到 ListView
- php - 为什么 laravel 分页只适用于 reture 而不是自定义响应处理程序
- matlab - Matlab subplot linkaxes 未按预期排列轴
- c# - In .net does a new thread get created for each System.Thread.Timer object in a process?
- python - 如何将训练有素的模型存储在 Google Colab 上并检索权重?
- javascript - Vue 自定义(cli?)项目生成器
- javascript - 如何使用拼接删除元素?
- parse-platform - 如何固定/取消固定 ParseObject 非递归?