代码之家  ›  专栏  ›  技术社区  ›  pynexj

如何防止pexpect重复密码?

  •  6
  • pynexj  · 技术社区  · 9 年前

    默认情况下, pexpect.spawn() 不会输出任何内容。但当我指定 logfile=sys.stdout 它还将回显密码(例如 ssh ). 因此,我如何才能看到与 spawn ed进程而不回显密码(就像 Expect ( Tcl 扩展)是否)?

    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 回复  |  直到 4 年前
        1
  •  5
  •   pynexj    4 年前

    只是为了回答这个问题。功劳归于 Thomas K 。有关详细信息,请参阅他在问题下的评论。

    [STEP 101] # cat foo.py
    #!/usr/bin/env python3
    
    import pexpect, sys
    
    spawn = pexpect.spawnu if sys.version_info[0] >= 3 else pexpect.spawn
    ssh = 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 102] #
    [STEP 103] # python2 foo.py
    foo@localhost's password:
    bash-5.1$ exit
    exit
    Connection to localhost closed.
    [STEP 104] #
    [STEP 105] # python3 foo.py
    foo@localhost's password:
    bash-5.1$ exit
    exit
    Connection to localhost closed.
    [STEP 106] #