如何防止pexpect回显密码?

时间:2016-03-22 02:40:55

标签: python expect pexpect

默认情况下,pexpect.spawn()不会输出任何内容。但是当我指定logfile=sys.stdout时,它也会回显密码(例如ssh)。那么如何在没有回复密码的情况下看到与spawn ed进程的实时交互(就像ExpectTcl扩展名一样)?

pexepct示例:

# cat expect.py
import pexpect, sys

logfile = sys.stdout if len(sys.argv) == 2 else None

ssh = pexpect.spawn('ssh foo@localhost', logfile=logfile)
ssh.delaybeforesend = 1
ssh.expect('assword:')
ssh.sendline('123456')

ssh.expect('\r\n\\$')
ssh.sendline('exit')
ssh.expect(pexpect.EOF)
ssh.wait()
# python expect.py                 <-- no output
# python expect.py stdout
foo@localhost's password: 123456   <-- the password is visible
Last login: Tue Mar 22 10:32:49 2016 from localhost
$ exit
exit
Connection to localhost closed.
#

期待示例:

# cat ssh.exp
spawn ssh foo@localhost
expect assword:
send "123456\r"
expect {\$}
send "exit\r"
expect eof
wait
# expect ssh.exp
spawn ssh foo@localhost
foo@localhost's password:          <-- the password is invisible
Last login: Tue Mar 22 10:45:03 2016 from localhost
$ exit
Connection to localhost closed.
#

1 个答案:

答案 0 :(得分:1)

只是为了回答问题。积分转到Thomas K。有关详细信息,请参阅他在问题下的评论。

[STEP 102] # cat pexp.py
import pexpect, sys

ssh = pexpect.spawn('ssh -t foo@localhost bash --noprofile --norc')
ssh.logfile_read = sys.stdout

ssh.expect('assword:')
ssh.sendline('123456')

ssh.expect('bash-[.0-9]+\\$')
ssh.sendline('exit')
ssh.expect(pexpect.EOF)
ssh.wait()
[STEP 103] # python pexp.py
foo@localhost's password:
bash-4.4$ exit
exit
Connection to localhost closed.
[STEP 104] #