我正在尝试使用 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。
如果有任何提示或想法,包括更好地表述我的问题的建议,我将不胜感激。我已经坚持这个问题好几个星期了。谢谢!
根据 pexpect doc (v4.8),它可能无法处理 Widnows 上的隐藏输入,建议使用 wexpect:
2.6 Windows 上的 Pexpect
Pexpect 可在 Windows 上用于等待子进程生成模式(使用
)或文件描述符(使用pexpect.popen_spawn.PopenSpawn
)。pexpect.fdpexpect.fdspawn
和pexpect.spawn
在 Windows 上不可用,因为它们依赖于 Unix 伪终端 (ptys)。跨平台代码不得使用这些。pexpect.run()
不能直接替代PopenSpawn
。许多程序仅在检测到它们正在终端中运行时才提供交互行为。 当由spawn
运行时,它们的行为可能会有所不同。PopenSpawn
另请参阅:
wexpect 是 Windows 的替代方案,可与隐藏控制台配合使用。