例如,我想创建一个 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
)这样的外部文件,并且仍然避免在内核进程表中暴露密码(即通过ps
、pgrep
等)。
笔记:这需要一个支持进程替换的现代 shell(例如bash
、zsh
或ksh
)。
该脚本包含纯文本密码,因此应受到所有权、组、权限和/或 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.