Я удивлен способ работы getpass()
. Я использую его в python
, однако я осознаю тот факт, что в действительности это вызов https://linux.die.net/man/3/getpass. Более того, я осознаю тот факт, что ssh-add
также использует его.
Нелегко думать о многих причинах.
Функция 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
(я проверил, и он работает). Кто-нибудь может объяснить это, пожалуйста?