如何将密码传递给mysql命令行

Kok*_*zzu 54 password mysql stdin

foo.php例如P455w0rd,当我尝试使用它时,我将 MySQL 密码保存在一个文件中:

$ cat foo.php | grep '$dbpwd=' | cut -d '"' -f 2 | mysql -U root -p mydb -h friendserver
Enter password: (holds)

$ echo P455w0rd | mysql -u root -p mydb -h friendserver
Enter password: (holds)
Run Code Online (Sandbox Code Playgroud)

这两个选项仍然要求输入密码,从 发送密码的正确方法是stdin什么?

Kus*_*nda 52

mysql客户端程序可以采取在命令行上输入密码与任一-p--password=选项。

如果使用-p,则选项字母后不得有任何空格:

$ mysql -pmypassword
Run Code Online (Sandbox Code Playgroud)

我更喜欢脚本中的长选项,因为它们是自我记录的:

mysql --password=mypassword --user=me --host=etc
Run Code Online (Sandbox Code Playgroud)

  • 这是不安全的,因为任何用户都可以查看密码 - 直接通过 `/proc/$pid/cmdline` 或通过 `ps` 命令。mysql 确实在启动期间覆盖了 argv 中的密码,但始终存在另一个用户可以观察密码的时间窗口。此外,在某些系统上,argv 覆盖可能不起作用。 (13认同)
  • 当然,这是不安全的,但大多数人在构建过程中都会做这样的事情,不久之后就会被删除...... (11认同)

gar*_*Red 47

您必须非常小心地将密码传递给命令行,因为如果您不小心,您最终会使用诸如ps.


最安全的方法是创建一个新的配置文件并将其传递给mysql使用--defaults-file=--defaults-extra-file=命令行选项。

两者之间的区别在于,除了默认配置文件之外,还会读取后者,而对于前者,仅使用作为参数传递的一个文件。

您的附加配置文件应包含类似于以下内容的内容:

[client]
user=foo
password=P@55w0rd
Run Code Online (Sandbox Code Playgroud)

确保您保护此文件。

然后运行:

mysql --defaults-extra-file=<path to the new config file> [all my other options]
Run Code Online (Sandbox Code Playgroud)

  • 在环境中设置 MYSQL_PWD(`export MYSQL_PWD=muhpassword`)并在没有 `-p` 的情况下执行你的命令。参见[MySQL 程序环境变量](https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html)。尽管手册中有 [可怕的警告](https://dev.mysql.com/doc/refman/5.7/en/password-security-user.html),但这 [相当安全](https://security. stackexchange.com/questions/20282/is-passing-sensitive-data-through-the-process-environment-secure)。除非你稍后在同一个 shell 中启动奇怪的warez。所以我们运行:`MYSQL_PWD=$(cat foo.php etc) mysql -u foouser -h barhost` (19认同)
  • @Kusalananda,是的,但根据 https://unix.stackexchange.com/q/385339/135943 上的评论,** 不** 意味着它是安全的! (3认同)
  • MySQL 将修改其 `argv` 以覆盖给定 `-p` 标志的参数。至少这就是这里的结论,以及其他相关信息:http://unix.stackexchange.com/questions/78757/securely-feeding-a-program-with-a-password (2认同)
  • 这是最好的解决方案,因为它提供了一定程度的安全性。您需要 chmod go-rwx,并确保此参数位于所有其他参数之前。 (2认同)

小智 11

创建一个文件~/.my.cnf,设置为只能自己访问,权限600。

   [client]
   user=myuser
   password=mypassword
Run Code Online (Sandbox Code Playgroud)

然后你就不需要再输入密码了。

   bash$ mysql -u myuser mydatabase
   mysql>
Run Code Online (Sandbox Code Playgroud)


Dan*_*ing 8

你可以使用一个漂亮的 Linux 技巧......

/dev/stdin可以用作文件资源,如下--defaults-file所示:

echo -e "[client]\nuser=xxx\npassword=xxx" | mysql --defaults-file=/dev/stdin -e 'select user()' <database_name>

您通常可以使用-代替/dev/stdin,但许多程序(包括mysql)不遵守这一约定。

有关文件资源的更多信息/dev/stdin

$ ls -la /dev/stdin
lrwxrwxrwx 1 root root 15 Jun 19 08:35 /dev/stdin -> /proc/self/fd/0
Run Code Online (Sandbox Code Playgroud)

这样您还可以检查空密码情况

  • 您应该使用“password”而不是“pass”,以免看到以下错误:“信息:使用唯一选项前缀“pass”很容易出错,并且将来可能会中断。请使用全名“密码”。` (2认同)

com*_*ike 5

正如@maxschlepzig 在评论中所说,

请注意,如果不指定 -p,mysql 会读取 MYSQL_PWD 环境变量。

所以在bash中:

read -s -p "Enter the mysql password for $DBUSER @ $DBNAME: " DBPASS 
export MYSQL_PWD="$DBPASS" 
mysqldump -u $DBUSER $DBNAME > dump.sql

# once you are done
export MYSQL_PWD="" 
Run Code Online (Sandbox Code Playgroud)

  • 来自 [MySQL 8.0 文档](https://dev.mysql.com/doc/refman/8.0/en/environment-variables.html)(表下方):“使用 `MYSQL_PWD` 指定 MySQL 密码必须被认为是极其不安全的,不应该使用。[...] `MYSQL_PWD` 从 MySQL 8.0 开始已被弃用;预计它会在 MySQL 的未来版本中被删除。” (4认同)