Bash echo-pipe进入Mysql shell失败

时间:2017-12-12 03:46:05

标签: php mysql regex bash shell

我将以下代码作为脚本的一部分,其目的是复制本地网站(在我的Ubuntu 16.04 xenial服务器环境中)。重复站点的目录名称,数据库用户名和数据库实例名称相同,并在${domain}变量中表示,而${rps}包含Mysql root密码,$ {sps}保存重复站点的数据库用户密码。

代码的第一部分工作正常(echoread)。第二部分失败(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}

我回显并管道Mysql命令的原因:

确保${sps}变量的变量替换(变量替换不能在mysql shell中发生,因此必须在外部完成并发送到{{} 1}} shell)。

问题

所有echo-pipe操作都失败,它们会启动辅助提示。

我的问题

为什么echo-pipe操作失败,也许这是一个正则表达式问题?

更多细节

完整代码可用here

1 个答案:

答案 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'

这将导致删除所有数据库(如果我的语法正确)。