下面的代码是脚本的一部分,它的目的是复制本地网站(在我的Ubuntu16.04异种服务器环境中)。复制的站点的dir名称、DB用户名和DB实例名是相同的,在${domain}变量中表示,而${rps}保存Mysql根密码,${sps}保存重复站点的DB用户密码。
代码的第一部分工作正常(echo和read)。第二部分失败(echo-|进入Mysql ):
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中进行,因此必须在${sps shell外部执行并发送到mysql shell中)。
问题所在
所有回显管操作都会失败,它们会启动一个辅助提示。
我的问题
为什么回波管操作失败,也许这是一个正则表达式的问题?
进一步详情
完整的代码是可用的这里。
发布于 2017-12-12 09:12:55
我也投票结束这个问题,但由于我有时间,我想我会写一些更多的信息,可能有帮助。
代码示例中会出现一些小错误。
不建议您在终端中传递密码,因为系统上的所有用户都可以看到操作和密码。例如,使用一个对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'这将导致删除所有数据库(如果语法正确的话)。
https://stackoverflow.com/questions/47765037
复制相似问题