为什么期望能够与`getpass`调用进行交互?

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

[我对getpass()的工作方式感到惊讶。我在python中使用它,但是我知道它实际上与https://linux.die.net/man/3/getpass调用有关。而且,我知道ssh-add也使用它的事实。

[从许多原因来思考是不容易的。

    1。

getpass()函数打开/ dev / tty(进程的控制终端),输出字符串提示,关闭回显,读取一行(“密码”),恢复终端状态并关闭/ dev / tty再次。

是什么意思?它会打开新的终端吗?在/dev/tty/通话之前打开getpass?恢复终端状态是什么意思?

  1. 为什么期望可以与ssh-addgetpass一起使用,而echo却不能?让我们考虑:
#getpass.py 
import getpass

password = getpass.getpass()
print password

    [user@host ~]$ python2.7 ~/getpass.py 
    Password: 
    somepassword

有效。为什么?我能够从键盘输入密码,所以我猜它已经从stdin中读取了。毕竟,诺言是关于读取密码/dev/tty,而不是stdin


[user@host ~]$ python2.7 ~/getpass.py # we allow it to wait for password and let check to new bash session
[user@host ~]$ # new bash session
[user@host ~]$ python2.7 ~/getpass.py
[user@host ~]$ pgrep python
21502
[user@host ~]$ ls -al /proc/21502/fd
razem 0
dr-x------ 2 user wheel  0 04-14 17:55 .
dr-xr-xr-x 9 user wheel  0 04-14 17:53 ..
lrwx------ 1 user wheel 64 04-14 17:55 0 -> /dev/pts/6
lrwx------ 1 user wheel 64 04-14 17:55 1 -> /dev/pts/6
lrwx------ 1 user wheel 64 04-14 17:55 2 -> /dev/pts/6
lrwx------ 1 user wheel 64 04-14 17:55 3 -> /dev/tty
[user@host ~]$ echo 'some_password' > /proc/21502/fd/0 #stdin of python process
[user@host ~]$ echo 'some_password' > /proc/21502/fd/3
some_password # it prins some_password here, I know why (driver of `/dev/tty` check which process call it) 

它确实不是工作。我不知道expect工具如何工作(我检查了一下并成功了)。有人可以解释吗?

python linux tty getpass
1个回答
0
投票

为什么?

expect充当终端程序。这样,它会分配一个伪终端(PTY),并将其设置为启动程序的活动终端。在Linux上,这是通过openpty()完成的。

因此,与openpty()类似,而不是通过stdout和stderr直接与终端交互的软件由getpass处理。

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