【问题标题】:Why expect is able to interact with `getpass` call?为什么期望能够与 `getpass` 调用进行交互?
【发布时间】:2020-07-27 10:35:18
【问题描述】:

我对@9​​87654322@ 的工作方式感到惊讶。我在python 中使用它,但我知道它实际上与https://linux.die.net/man/3/getpass 通话有关。此外,我知道ssh-add 也使用它。

从多方面考虑并不容易。

    1.

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

这是什么意思?它打开了新的终端? /dev/tty/getpass 调用之前打开?
恢复终端状态是什么意思?

  1. 为什么 expect 可以与 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 工具是如何工作的(我检查了它并且它工作)。谁能解释一下?

【问题讨论】:

  • 您能解释一下getpass 终端的变化吗?为什么期望能够写入另一个进程的/dev/tty?仿真使事情变得更加复杂;)
  • 你是什么意思,“另一个进程”? expect 创建自己的 TTY,它启动的子进程继承并写入该 TTY。

标签: python linux tty getpass


【解决方案1】:

为什么?

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

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

【讨论】:

  • expectterminator 吗?
  • 只要它们都创建 PTY 并在其中运行的程序与之交互,是的。
  • 如果你想看一个更简单的程序来做同样的事情,看看EmPTY
  • 当我启动 terminatorexpect 时,它会与 kernel 对话:给我一个伪终端 (/dev/pts) 设备?
  • 是的。请参阅 github.com/ierton/empty/blob/master/empty.c 的 EmPTY 的来源,或提及的任何其他程序;特别是openpty的使用
猜你喜欢
  • 1970-01-01
  • 2012-10-30
  • 2022-11-02
  • 2021-10-09
  • 2017-11-27
  • 1970-01-01
  • 2020-08-21
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多