该程序的一件事mysql
引起了我的注意。可以告诉它通过-p
标志以交互方式询问密码,在这种情况下,正如您所期望的那样,您的终端中会出现一个提示,并且输入的任何内容都会被接受为密码。令我惊讶的是,即使您重定向所有三个,也会发生这种情况std{in,out,err}
:
$ mysql -p </dev/null >/dev/null 2>/dev/null
Enter password:
它也能正确读取密码。如果重定向stderr
到文件,则可以检查登录是否失败。
进程如何知道在哪个终端上请求密码?它是否检查附加终端到父进程?
一个 unix 进程可以从 /dev/tty 读取,因此可以绕过重定向。
它可以调用
isatty
unistd 函数。可能正如@Gerard H. Pille 指出的那样,mysql 根本不检查,而只是
/dev/tty
在您调用它时使用-p
.一些额外的细节
我检查了isatty 实现的 glibc 来源。
它只是使用该
tcgetattr
函数来获取文件描述符的终端功能。如果函数返回 true,则它是一个终端。它使用
getpass()
来自 libc(如果可用),其在手册页中的描述如下: