在 shell 脚本中使用密码

在 shell 脚本中使用密码

例如,我想创建一个 cron 脚本来与 mysql 交互

#!/bin/bash

mysql -uroot -p
echo root
echo "CREATE DATABASE example"

但并不起作用,只是提示:

Enter password:

当我退出 mysql 时它显示

root
"CREATE DATABASE example"

任何想法?

答案1

放一些类似的东西:

[client]
user=root
password="my-very-secret-password"

在一个文件中,其权限确保有权读取该文件的人员之外的任何人都无法读取该文件。

并运行:

#! /bin/sh -
mysql --defaults-extra-file=/path/to/that/file --batch << "EOF"
CREATE DATABASE example
EOF

MySQL自己的指南本身了解更多信息。

您可以将密码放入脚本中并限制对脚本本身的读取访问,但您还需要确保密码不会作为参数传递给任何命令,因为这会使其在输出中对任何人都可见ps

你可以这样做:

#! /bin/sh -
mysql --defaults-extra-file=/dev/fd/3 --batch 3<< "END_OF_AUTH" << "END_OF_SQL"
[client]
user=root
password="my-very-secret-password"
END_OF_AUTH
CREATE DATABASE example
END_OF_SQL

答案2

这与 Stéphane Chazelas 的答案类似,但使用流程替代和一个 shell 函数而不是一个 Heredoc 来提供用户和密码:

#!/bin/bash

printconf() {
cat <<-EOF
    [mysql]
    user=root
    password=supersecretpassword
EOF
}

mysql --defaults-extra-file=<(printconf) -e 'CREATE DATABASE example'

函数 ( printconf) 只是输出格式正确的 mysql conf 文件。

IMO,这比一行上有多个heredocs更具可读性。

它仍然将用户和密码详细信息嵌入到脚本中(因此不需要像~/.my.cnf)这样的外部文件,并且仍然避免在内核进程表中暴露密码(即通过pspgrep等)。

笔记:这需要一个支持进程替换的现代 shell(例如bashzshksh)。


该脚本包含纯文本密码,因此应受到所有权、组、权限和/或 ACL 的充分保护。即至少,它不应该是世界可读的。

答案3

您应该能够使用以下命令执行 sql 语句:

mysql -u root -p<password> -e "CREATE DATABASE example"

注意 -p 和密码之间没有空格

答案4

与 Stéphane Chazelas 的回答类似,您可以.my.cnf在用于执行脚本的用户的家中创建一个,添加您的凭据,然后执行您的脚本。

〜/.my.cnf

[client]
user=root
password="This15MyPa55word"

脚本

#!/bin/bash
mysql -e "CREATE DATABASE example"

man mysql

--execute=语句, -e 语句

      Execute the statement and quit. The default output format is like that produced with --batch. See Section 4.2.4, “Using
      Options on the Command Line”, for some examples. With this option, mysql does not use the history file.

相关内容