我对工作方式感到惊讶getpass()
。我正在使用它python
,但是我知道它实际上与https://linux.die.net/man/3/getpass调用有关。此外,我也知道ssh-add
使用它的事实。
从多方面考虑,这并不容易。
-
1.
getpass() 函数打开/dev/tty(进程的控制终端),输出字符串提示,关闭回显,读取一行(“密码”),恢复终端状态并再次关闭/dev/tty。
这是什么意思?它打开了新的终端?/dev/tty/
通话前打开getpass
?
恢复终端状态是什么意思?
- 为什么期望可以工作
ssh-add
或不能getpass
工作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
工具如何工作(我检查过它并且它工作)。谁能解释一下,好吗?