【问题标题】:Bash echo-pipe into Mysql shell failsbash echo-pipe 进入 Mysql shell 失败
【发布时间】:2018-05-25 16:34:57
【问题描述】:

我将以下代码作为脚本的一部分,其目的是复制本地网站(在我的 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}

我 echo 和 pipe Mysql 命令的原因:

这样做是为了确保${sps}变量的变量替换(变量替换不能发生在mysql shell内部,所以必须在外部完成并发送到mysql shell)。

问题

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

我的问题

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

更多详情

完整代码可在here获取。

【问题讨论】:

  • -p"${rps} 每行缺少一个结束双引号。我投票结束这个问题作为一个简单的印刷错误。

标签: php mysql regex bash shell


【解决方案1】:

我也投票结束这个问题,但由于我有时间,我想我会写一些可能有帮助的更多信息。

您的代码示例中存在许多小错误。

不建议您在终端中传递密码,因为系统上的所有用户都可以看到操作和密码。例如,通过对ps auxwww 的简单请求。

更好的选择是使用mysql_config_editor 创建一个安全登录,在从本地主机使用时不需要密码。然后你可以使用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'

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

【讨论】:

    猜你喜欢
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多