我将以下代码作为脚本的一部分,其目的是复制本地网站(在我的Ubuntu 16.04 xenial服务器环境中)。重复站点的目录名称,数据库用户名和数据库实例名称相同,并在${domain}
变量中表示,而${rps}
包含Mysql root密码,$ {sps}保存重复站点的数据库用户密码。
代码的第一部分工作正常(echo
和read
)。第二部分失败(echo
- |
到Mysql shell中):
echo "1/3: Please enter the domain of the site for duplication." && read domain
echo "2/3: Please enter the password for your Mysql root user." && read -s rps
echo "3/3: Please enter the password of the site's DB user." && read -s sps
echo "DROP USER IF EXISTS 'test'@'localhost';" | mysql -u root -p"${rps}
echo "DROP database IF EXISTS test;" | mysql -u root -p"${rps}
echo "CREATE USER 'test'@'localhost' IDENTIFIED BY \"${sps}\";" | mysql -u root -p"${rps}
echo "CREATE database test;" | mysql -u root -p"${rps}
echo "GRANT ALL PRIVILEGES ON test.* TO test@localhost;" | mysql -u root -p"${rps}
确保${sps
}变量的变量替换(变量替换不能在mysql shell中发生,因此必须在外部完成并发送到{{} 1}} shell)。
所有echo-pipe操作都失败,它们会启动辅助提示。
为什么echo-pipe操作失败,也许这是一个正则表达式问题?
完整代码可用here。
答案 0 :(得分:0)
我也投票决定关闭这个问题,但是由于我有时间,我想我会写一些可能有帮助的信息。
您的代码示例中出现了许多小错误。
建议您不要在终端中传递密码,因为系统上的所有用户都可以看到操作和密码。例如,对ps auxwww
的简单请求。
更好的选择是使用mysql_config_editor
创建一个安全登录,从localhost使用时不需要密码。然后,您可以使用mysql --login-path=master
之类的内容,无需密码。
如果您确实想要查看纯文本路径中显示的密码,那么您应该使用长语法,即:
mysql --password=plaintext --user=user --database=dbname < "mysql query"
或者
echo "mysql query" | mysql --password=plaintext --user=user --database=dbname
或者
mysql --password=plaintext --user=user --database=dbname << END
mysql query to run;
another mysql query to run;
and another mysql query to run;
END
或者,最好看一下你的代码:
mysql --password=plaintext --user=user --database=dbname --execute='mysql query'
但是,你应该得到一个警告(我现在记不起来的是什么)关于密码在看得见或什么的。
要使用其中一个代码示例,脚本行将是(不需要echo
):
mysql --user=root --password=${rps} --execute="DROP USER IF EXISTS 'test'@'localhost';"
现在你编码失败的原因(正如你现在所知)。
"
之前的问题是${rps}
。删除"
将起作用 - 但我根本不会使用该代码,因为它有其他潜在问题。
例如,当脚本请求密码时,为root
用户密码输入以下内容:
password; -e 'DROP ALL DATABASES'
这将导致删除所有数据库(如果我的语法正确)。