【问题标题】:Sql query over SSH not working通过 SSH 的 Sql 查询不起作用
【发布时间】:2013-09-29 03:00:12
【问题描述】:

我正面临一个让我发疯的问题,我一直在寻找解决方案,但我对 php 的有限知识不足以解决它,所以我们开始吧,希望你能帮助我。

我正在通过 PHP 生成如下查询:

CREATE USER 'wally'@'localhost' IDENTIFIED BY 'wally123'; 
GRANT USAGE ON * . * TO 'wally'@'localhost' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; 
GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'localhost'; 
CREATE USER 'wally'@'%' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'%' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; 
GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'%'; 
CREATE DATABASE wally_foro; 
CREATE DATABASE wally_foro2;

当我在我的 phpmyadmin 上运行它时,它可以完美运行,但是当我将此查询输入 ssh 命令并发送它时:

mysql -uMYUSERHERE -pMYPASSWORDHERE  -e "CREATE USER 'wally'@'localhost' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'localhost' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'localhost'; CREATE USER 'wally'@'%' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'%' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON `wally\_%` . * TO 'wally'@'%'; CREATE DATABASE wally_foro; CREATE DATABASE wally_foro2;"

它只是给我一个错误:

第 1 行出现错误 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“ TO 'wally'@'localhost'' 附近使用正确的语法*

我需要它是一个 ssh 连接,但我不知道如何使它工作。如果假设我不能直接在命令行上使用脚本,为什么它会通过 line 命令而不是在 phpmyadmin 中退出错误。我错了吗?

谢谢你,非常感谢你的支持!


感谢您的支持。到目前为止,我得到了这个:

mysql -uMYUSER -pMYPASS  -e "CREATE DATABASE wally_foro; CREATE DATABASE wally_foro2; CREATE USER 'wally'@'localhost' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'localhost' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON ``wally\\\_\%`` . * TO 'wally'@'localhost'; CREATE USER 'wally'@'\%' IDENTIFIED BY 'wally123'; GRANT USAGE ON * . * TO 'wally'@'\%' IDENTIFIED BY 'wally123' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ; GRANT ALL PRIVILEGES ON ``wally\\\_\%`` . * TO 'wally'@'\%'; "

现在它确实创建了 localhost 用户和数据库,但不是我认为可能涉及符号 % 的外部用户,我试图对其进行转义并复制它,但仍然无法正常工作。

谢谢!

【问题讨论】:

  • 你试过单独输入每个命令吗?
  • 是的,同样的错误。谢谢!

标签: php mysql sql ssh


【解决方案1】:

用单引号替换整个字符串周围的双引号,然后在每个内部单引号之前放置反斜杠 - 或 - 使用 " 双引号将所有引号括起来的参数和 @987654323 切换你的引用@ 你希望 MySQL 执行的整个字符串的单引号。

双引号是比单引号“弱”的引号字符,当某些字符被双引号括起来时,shell 仍会尝试解释它们......但不是单引号。

请参阅this DBA.se answer 了解更多详情。

【讨论】:

  • 它也确实有效!现在我必须想办法做我想做的事!非常非常感谢!
【解决方案2】:

当我需要在命令行上运行超过 1-2 条 SQL 时,我通常将它们全部放在一个文本文件中然后运行:

mysql -uMYUSER -pMYPASS < /path/to/my/file

当有特定字符(外文字母 UTF-8 编码)时也很有用。

【讨论】:

  • 我一直在寻找这个命令好几天了......因为我的第一个想法是使用 printf 创建一个文件,该文件记录变量以便制作脚本并能够直接上传它到mysql服务器,但我没有设法在一行中上传文件......这只是发生在像我这样的初学者身上。我真的很感谢你!解决了:)
【解决方案3】:

反引号是问题所在:它们是一个 shell 字符,并且在 SSH 命令行连接到远程服务器之前被评估。你应该用反斜杠转义每个。

【讨论】:

  • 谢谢!我觉得你和 Lordblacksuca 的解决方案很接近。已经这样做了(以及单引号),但现在我确实得到了这个错误:-bash:命令替换:第 1 行:在寻找匹配的 ``'-bash:命令替换:第 2 行:语法错误:意外结束第 1 行的文件错误:未知命令 '\''。
【解决方案4】:

你试过转义单引号吗?

"CREATE USER \'wally\'@\'localhost.....

【讨论】:

  • 谢谢,它确实有帮助!但我仍然没有达到最终的解决方案。
猜你喜欢
  • 2016-10-04
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 2019-04-21
  • 2013-11-15
相关资源
最近更新 更多