Почему ожидаемый может взаимодействовать с вызовом `getpass`? - PullRequest
0 голосов
/ 14 апреля 2020

Я удивлен способ работы 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 (я проверил, и он работает). Кто-нибудь может объяснить это, пожалуйста?

1 Ответ

0 голосов
/ 14 апреля 2020

Почему?

expect действует как терминальная программа. Таким образом, он выделяет псевдотерминал (PTY) и устанавливает его в качестве активного терминала для запускаемых программ. На Linux это делается с openpty().

Таким образом, программное обеспечение, которое (например, getpass) взаимодействует напрямую с терминалом, а не через stdout и stderr, обрабатываются expect.

...