我有时会这样做echo "secret" | mysql -u root -p ...
。现在我担心这里的安全性:列出所有进程的人能看到密码吗?
为了检查,我尝试使用echo "test" | sleep 1000
echo 命令并输入以下秘密不是在“ps aux”的输出中可见。所以我认为它是安全的 - 但安全专家可以确认一下吗?:)
答案1
答案取决于你使用的 shell。许多 shellecho
都有内置命令意味着它不会生成单独的进程,因此不会显示在进程列表中。但是,如果您键入/bin/echo
或,./echo
或者如果您使用该命令禁用内置命令enable -n echo
,则 shell 将不会使用其内置命令,而是使用二进制版本。这将显示在进程列表中。
如果您使用的是二进制文件而不是内置的 shell,则 echo 命令将显示,直到将数据移动到其他进程的 STDIN 缓冲区。此缓冲区的大小是有限的,因此如果数据量超过缓冲区的容量,则 echo 命令将不得不等待一段时间,直到其他进程可以从缓冲区中读取部分数据。在大多数情况下(例如您上面给出的两个示例),此时间段将是微秒。如果您碰巧使用 echo 将 20MB 的 SQL 转储粘贴到 MySQL,则可能需要更长的时间。无论时间有多短,如果您使用的是二进制文件而不是内置的 shell,并且有人碰巧掌握了正确的时间,他们将能够在进程列表中看到该进程。
您可以通过将秘密数据放入文件(具有适当的权限)并将该文件用作 STDIN 来避免这种情况,如下所示:
mysql -u root -p < file_with_secret.sql
答案2
对于 mysql 来说 ~/.my.cnf 可以用来存储机密,即
[client]
user = DBUSERNAME
password = DBPASSWORD
host = DBSERVER
[mysql]
database = DBNAME
答案3
只需使用
mysql -uroot -p
然后按回车键。然后系统将提示您输入密码,并且该密码不会显示在进程列表或历史文件中。
答案4
如果“安全”是指“在 的输出中不可见” ps
,那么是的,它是安全的。但不要忘记,UID
与正在运行的 mysql 客户端共享 的其他进程(或显然以 root 权限运行的进程)可以访问其STDIN
。要使用您的 echo/sleep 示例:
sh-5.1$ echo "test" | sleep 1000 &
[1] 3960020
sh-5.1$ cat /proc/3960020/fd/0
test
以上是Linux
具体的,并且依赖于procfs
。