Windows 上的 pexpect,将文本发送到输入隐藏字段

问题描述 投票:0回答:1

我正在尝试使用 python 的

pexpect
库与名为
fei5kinit
的命令进行交互,该命令为文件交换接口创建持久身份验证凭据。在 Windows 和 macOS 上,只需在命令提示符/终端中运行命令
fei5kinit
的过程如下所示:

$ fei5kinit
Server group>>YOUR_GROUP
User name>>YOUR_USERNAME
Passcode>>

使用正确的凭据,该命令将完成,没有额外的输出;命令提示符/终端将返回标准输入字符,并且持久身份验证会话将被创建。 值得注意的是,

Passcode>>
输入字段是隐藏的,当您键入时,那里不会出现任何字符。

在 macOS 上,使用 python 3.11+,我成功捕获了整个过程,如下所示:

# First, set up the fei5 command line tools (proprietary) and set the environment variable
import pexpect
child = pexpect.Spawn('fei5kinit')
child.expect('Server group>>')
child.sendline('YOUR_GROUP') # Example input
child.expect('User name>>') 
child.sendline('YOUR_USERNAME') # Example input
child.expect('Passcode>>')
child.sendline('YOUR_PASSWORD') # Example input
index = child.expect(pexpect.EOF, "Authentication Error") # Check for valid login
if index == 0:
    print('Authentication Complete')
else:
    print('Error')
# >>> Authentication Complete

运行此代码后,我可以通过简单调用

fei5list
来运行其他命令(如
fei5get
subprocess.Popen
),并且它们的行为符合预期。

但是,当我尝试在 Windows 上执行相同的操作时遇到了问题。由于 Windows 直接支持

pexpect
,因此我已将
child = pexpect.Spawn('fei5kinit')
行替换为
child = pexpect.popen_spawn.PopenSpawn('fei5kinit')
。其余代码保持不变。据我所知,代码可以很好地发送
Server group
User name
,但当它到达
Passcode
字段时会失败。

我怀疑这可能与

Passcode
字段被隐藏有关,并且
PopenSpawn()
在模仿用户输入的能力方面并不等同于
Spawn()
,这可能需要与隐藏字段进行交互。但这只是我的理论。除了上面描述的之外,我还尝试了使用
pywinpty
winpexpect
pywinauto
的各种方法,但均无济于事。我也尝试过使用
subprocess
但没有成功。我得到的最接近的是通过
fei5kinit
生成
pexpect.popen_spawn.PopenSpawn()
命令。我运行的是 Windows 11。

如果有任何提示或想法,包括更好地表述我的问题的建议,我将不胜感激。我已经坚持这个问题好几个星期了。谢谢!

python windows subprocess passwords pexpect
1个回答
0
投票

根据 pexpect doc (v4.8),它可能无法处理 Widnows 上的隐藏输入,建议使用 wexpect:

  • 2.6 Windows 上的 Pexpect

    Pexpect 可在 Windows 上用于等待子进程生成模式(使用

    pexpect.popen_spawn.PopenSpawn
    )或文件描述符(使用
    pexpect.fdpexpect.fdspawn
    )。

    pexpect.spawn
    pexpect.run()
    在 Windows 上不可用,因为它们依赖于 Unix 伪终端 (ptys)。跨平台代码不得使用这些。

    PopenSpawn
    不能直接替代
    spawn
    。许多程序仅在检测到它们正在终端中运行时才提供交互行为。 当由
    PopenSpawn
    运行时,它们的行为可能会有所不同。

    另请参阅:

    wexpect 是 Windows 的替代方案,可与隐藏控制台配合使用。

© www.soinside.com 2019 - 2024. All rights reserved.