Vagrant配置问题:编写Shell脚本自动导入SQL文件至MariaDB
如何在Vagrant的Shell脚本中无交互导入SQL文件到MariaDB
嗨,作为刚上手Vagrant和数据库脚本的新手,这个交互提示的问题确实挺烦人的——毕竟脚本就是要自动化嘛!我来给你几个实用的方案,帮你彻底搞定这个无交互导入的需求~
核心思路:绕开mysql的交互密码提示
mysql命令默认的交互模式是为了安全,但在自动化脚本里我们可以通过几种方式跳过它,同时保证导入SQL文件的流程顺畅。
方案1:命令行直接指定密码(适合开发环境快速测试)
你可以在-p后面直接跟上密码(注意不要加空格),这样mysql就不会弹出交互提示了。比如你的SQL文件是data.sql,目标数据库叫my_app_db,root用户密码是dev_password,命令可以这么写:
mysql -uroot -pdev_password my_app_db < /vagrant/data.sql
注意:这种写法的密码会在系统进程列表里可见,所以只适合本地开发环境用,生产环境千万别这么干!
方案2:用环境变量传递密码(更安全一点)
把密码放在环境变量MYSQL_PWD里,mysql会自动读取这个变量作为密码,这样密码不会暴露在命令行历史或进程列表中:
MYSQL_PWD="dev_password" mysql -uroot my_app_db < /vagrant/data.sql
或者也可以用--password参数的完整写法,效果一样:
mysql -uroot --password=dev_password my_app_db < /vagrant/data.sql
方案3:用MySQL配置文件(最安全的长期方案)
创建一个.my.cnf配置文件,让mysql自动读取里面的账号密码,这是最安全的方式,密码不会出现在任何命令行相关的地方。
在你的bootstrap.sh里可以这么写:
# 创建root用户的mysql配置文件 cat > /root/.my.cnf << EOF [mysql] user=root password=dev_password EOF # 给配置文件设置严格权限,避免其他用户读取 chmod 600 /root/.my.cnf
之后导入SQL的命令就可以简化成:
mysql my_app_db < /vagrant/data.sql
结合Vagrant的完整bootstrap.sh示例
这里给你一个完整的脚本模板,包含安装MariaDB、创建数据库、无交互导入SQL的全流程:
#!/usr/bin/env bash # 更新系统包 apt-get update -y # 安装MariaDB服务器 apt-get install -y mariadb-server # 启动并设置开机自启MariaDB systemctl start mariadb systemctl enable mariadb # (可选)无交互初始化MariaDB安全设置(设置root密码、移除匿名用户等) mysql_secure_installation << EOF y dev_password dev_password y y y y EOF # 创建目标数据库(如果不存在的话) MYSQL_PWD="dev_password" mysql -uroot -e "CREATE DATABASE IF NOT EXISTS my_app_db;" # 导入SQL文件(注意:Vagrant会把宿主机器上Vagrantfile所在目录挂载到虚拟机的/vagrant,所以直接用这个路径) MYSQL_PWD="dev_password" mysql -uroot my_app_db < /vagrant/data.sql
几个关键注意点
- 替换示例中的
dev_password、my_app_db为你实际的密码和数据库名称。 - 确保你的
data.sql文件和Vagrantfile放在同一个目录下,这样虚拟机里才能通过/vagrant/data.sql访问到它。 - 如果你的MariaDB版本不同,服务名可能是
mysql而不是mariadb,可以根据实际情况调整systemctl的命令。
内容的提问来源于stack exchange,提问作者Wally Kolcz
相关产品推荐
相关产品推荐

