采取以下命令:
mysql -u root -p < load_data.sql > output.tab
-p
标志告诉mysql客户端 - 一个C程序 - 为用户提供输入密码的交互式提示。
AFAIK,这样的输入通常是通过向stderr
写一个提示然后阻止来自gets
的调用来处理,该调用从标准输入读取一行。
但是shell已经打开了load_data.sql
文件并将mysql客户端的stdin
设置为其文件描述符 - 所以不应该调用gets
来获取第一行文件?
我最初的想法是,该程序在阅读之前寻求结束 - 但你不能在管道上寻求这样的东西!
那么这是如何工作的?有魔力吗?
答案 0 :(得分:3)
提示输入密码的应用程序通常不实际上是从stdin中读取它们,理由是这会导致密码出现在屏幕上,如果它是以交互方式输入的, (b)当需要自动化事物时(例如,通过ps
在其他人可见的命令行中),鼓励在公开可见的地方围绕明文密码。 PostgreSQL的psql
SQL shell直接打开终端设备,我怀疑mysql也会这样做。
一些快速搜索发现this related question。评价最高的答案提到了GNU函数getpass()
,它确实打开了与终端的直接连接,绕过了stdin。我怀疑该功能是大多数密码提示程序在* nix中使用的功能。
答案 1 :(得分:0)
这不是正在打开的管道,而是stdin
重定向到指向文件。因此,您既可以使用FILE*
(即流),也可以使用正常的文件描述符。对于较低级别的文件描述符,您可以执行搜索操作,例如lseek()
等,可以与read()
一起使用以便在文件中移动。
如果您希望在将stdin
重定向到文件时仍然从控制终端读取数据,则只需打开控制终端以读取另一个文件描述符。您可以使用ctermid()
来确定进程的控制终端是什么,并在另一个文件描述符上重新打开它。