【问题标题】:Switch between interactive and non-interactive mode in pexpect在 pexpect 中切换交互和非交互模式
【发布时间】:2020-08-17 00:06:50
【问题描述】:

我正在使用 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 脚本。

如果不希望,请提出不基于 paramiko、pysftp 的解决方案

【问题讨论】:

  • 我想将文件上传到我的 SFTP 服务器。但是,我不允许使用 paramiko/pysftp。可以只使用纯python或pexpect
  • 这是一个用户应该验证的要求。此外,添加到“known_hosts”对我有用,但如果其他人在他们的机器上运行这个脚本,他们最好验证
  • 所有这些 pexpect 代码都在我的脚本中!

标签: python subprocess sftp pexpect


【解决方案1】:

查看pexpect documentation

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

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

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

p.interact('a')

【讨论】:

  • 感谢您回答这个问题。我确实尝试过这种方法,但是我陷入了以下困境。如果用户按“是”和转义字符(我现在保留回车键),用户确实退出了交互模式,但“是”似乎没有被捕获,因为我没有看到 sftp 主机“known_hosts”中的条目。需要检查为什么按“yes”和“escape character”不会将主机添加到“known_hosts”。为什么该输入没有被正确接受。
  • 2.我将转义字符保留为“a”(根据您的回答)。在这种情况下,当用户说“是”并且我没有按“a”时,该条目会添加到“known_hosts”中并提示我输入密码(如果我按“a”,我会退出交互式。但是,我不希望用户看到该密码提示。
猜你喜欢
  • 2021-09-23
  • 2012-02-02
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2012-10-18
  • 2016-02-17
  • 2017-06-05
  • 1970-01-01
相关资源
最近更新 更多