gpt4 book ai didi

python - 对 pexpect 模块几乎不需要帮助

转载 作者:太空狗 更新时间:2023-10-29 14:48:38 25 4
gpt4 key购买 nike

需要 pexpect 模块的帮助

我写了一个简单的代码,可以使用 ssh 从服务器克隆一个 git 存储库。我面临几个问题。

密码以纯文本形式显示。

我不知道下载后退出程序的正确方法。它抛出以下错误...

Traceback (most recent call last):
File "ToDelete3.py", line 65, in <module>
# # if i == 1:
File "ToDelete3.py", line 36, in getRepository
i = p.expect([ssh_key,'password:',pexpect.EOF])
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1492, in interact
self.__interact_copy(escape_character, input_filter, output_filter)
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1520, in __interact_copy
data = self.__interact_read(self.child_fd)
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1510, in __interact_read
return os.read(fd, 1000)
OSError: [Errno 5] Input/output error

到目前为止我写的代码是:

command = 'git clone ssh://username@someserver/something.git'
ssh_key = 'Are you sure you want to continue connecting'

def gracefulExit():
print 'Password Incorrect !!!'
os._exit(1)

def getRepository():
p = pexpect.spawn(command,maxread=10000,timeout = 100)
p.logfile = sys.stdout # logs out the command
i = p.expect([ssh_key,'password:',pexpect.EOF])
if i == 0:
print 'Inside sshkey'
p.sendline('yes')
i = p.expect([ssh_key,'password:',pexpect.EOF])
if i == 1:
try:
p.sendline('mypassword') # this mypassword is shown in clear text on the console
p.interact()
p.logfile = sys.stdout
p.expect(pexpect.EOF)
except Exception,e:
print str(e)
gracefulExit()
if i == 2:
print 'Inside EOF block'
if p.isalive():
print '******************************************************'
print ' Closing the process of Download !!! '
print '******************************************************\n\n'
p.close()

非常感谢任何输入..

谢谢。-维杰

最佳答案

程序中有几个错误:

p.interact()

当我们想要在使用 pexpect 模块自动提供密码后取回控制权时使用。您不需要使用它,因为您正在自动执行整个存储库 checkout 。

还有一些事情可以改进,在传递密码后,设置无限超时,因为复制 git 存储库可能需要一段时间。

p.expect(pexpect.EOF, timeout=None)

之后你可以用下面的命令读取所有的执行输出

output_lines =  p.before
output_lines_list = output_lines.split('\r\n')
for line in output_lines: print line

您还可以使用上面的方法通过直接写入文件来将输出记录到文件

使用 p.logifile = sys.stdout 不好,因为它会从一开始就记录预期操作,包括密码传递。

此后无需关闭,您运行的不是交互式程序。删除所有这些行:

if i == 2:
print 'Inside EOF block'
if p.isalive():
print '******************************************************'
print ' Closing the process of Download !!! '
print '******************************************************\n\n'
p.close()

问题是有些地方您必须存储密码并将其与 p.sendline 一起使用。但是,您存储密码,这将是不安全的。您也可以在开始时输入密码,这样您就不会将密码存储在程序中,但这会破坏自动化。我看不到出路,但要输入密码,您可以:

import getpass
getpass.getpass("please provide your password")

关于python - 对 pexpect 模块几乎不需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11208931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com