pipe道密码和安全

我有时会echo "secret" | mysql -u root -p ... echo "secret" | mysql -u root -p ... 现在我对这里的安全性表示认同:列出所有进程的人是否可以看到密码?

要检查我试着echo "test" | sleep 1000 echo "test" | sleep 1000并且带有秘密的回显命令在“ps aux”的输出中可见。 所以我认为这是安全的 – 但安全专家可以确认吗? 🙂

答案取决于你使用的是哪个shell。 许多shell声明为内build命令,这意味着它不会产生一个单独的进程,因此不会显示在进程列表中。 但是,如果您键入/bin/echo./echo或者如果使用enable -n echo命令禁用内build命令,那么shell将不会使用其内置命令,而是使用二进制版本。 这将显示在进程列表中。

如果你使用的是二进制而不是内置的shell,只要把数据移动到其他进程的STDIN缓冲区,echo命令就会显示出来。 这个缓冲区有一个有限的大小,所以如果有更多的数据可以放入缓冲区,那么echo命令将不得不暂停一会儿,直到另一个进程可以从缓冲区读取一些数据。 对于大多数情况(如上面给出的两个例子),这段时间将是微秒。 如果你碰巧使用echo将20MB的SQL转储粘贴到MySQL中,这可能会更长。 不pipe时间有多短,如果你使用的是二进制而不是shell内build的,而且有人碰巧得到正确的时间,他们将能够看到进程列表中的进程。

您可以通过将秘密数据放入一个文件(具有适当的权限)并将文件用作STDIN来避免这种情况:

 mysql -u root -p < file_with_secret.sql 

对于mysql情况〜/ .my.cnf可以用来存储秘密,即

 [client] user = DBUSERNAME password = DBPASSWORD host = DBSERVER [mysql] database = DBNAME 

只是使用

mysql -uroot -p

并回车。 系统会提示您input密码,并且在进程列表或历史logging文件中都不会显示。