如何在MySQL备份加密的Bash脚本中为openssl enc提供密码?
解决openssl加密时自动填充密码的问题
首先纠正你原脚本里的一个错误:tar -cf ${DB}_${DATE}.tar *.sql 是直接创建本地tar文件,不会将内容输出到管道,因此openssl实际没拿到有效加密数据。要让tar把内容传给管道,需要用-作为输出目标,让tar将内容输出到标准输出。
接下来是自动填充密码的几种可行方案:
方案1:通过环境变量传递密码
把密码存到环境变量里,openssl可以直接读取该变量,避免明文暴露在命令行:
# 设置加密密码的环境变量(建议脚本开头设置,且确保脚本权限为700,防止其他用户查看) export DB_ENCRYPT_PWD="your_strong_password_here" # 打包SQL文件并加密输出 tar -cf - *.sql | openssl enc -aes-256-cbc -pbkdf2 -e -passin env:DB_ENCRYPT_PWD > ${DB}_${DATE}.tar.enc
如果需要同时压缩文件,把tar命令改成tar -czf - *.sql,输出文件后缀可以用.tar.gz.enc。
方案2:通过密码文件传递密码
把密码写入一个权限严格控制的文件,让openssl读取该文件:
# 先创建密码文件,必须设置严格权限防止泄露 echo "your_strong_password_here" > /path/to/db_encrypt.pwd chmod 600 /path/to/db_encrypt.pwd # 打包加密 tar -cf - *.sql | openssl enc -aes-256-cbc -pbkdf2 -e -passin file:/path/to/db_encrypt.pwd > ${DB}_${DATE}.tar.enc
不推荐的方案:明文直接写在命令行
虽然可以用-passin pass:yourpassword直接在命令行指定密码,但这种方式会让密码出现在系统进程列表(通过ps命令就能看到),风险极高,绝对不建议在生产环境使用。
额外注意
解密时也需要对应传递密码,比如用环境变量的话,解密命令是:
openssl enc -aes-256-cbc -pbkdf2 -d -passin env:DB_ENCRYPT_PWD < ${DB}_${DATE}.tar.enc | tar -xf -
内容的提问来源于stack exchange,提问作者alfred
相关产品推荐
相关产品推荐

