在命令行中通过ssh在远程机器上运行MySQL查询

35

我正在尝试使用以下命令在远程机器上运行MySQL查询:

ssh user@192.168.2.26 "mysql -uroot -proot -e \"use test";""

我无法使用那个数据库。

请建议一个可行的命令。

6个回答

48

试一下这个:

mysql -h host -u root -proot -e "show databases;";

1
对于脚本编写,建议使用~/my.cnf或MYSQL_PWD变量>>请参考http://unix.stackexchange.com/questions/227648/mysqldump-via-crontab-pass-password-hashed-password-file-so-i-can-use-via-c/227664#227664。 - FreeSoftwareServers
1
我认为最后一个分号不是必需的。 - Horsty
3
对我来说,@King-Wzrd的答案是正确的。这个答案缺少ssh命令的部分,并且没有提供关于引号的指示,而这才是解决问题的真正难点。 - FRa

17

试试这个:

ssh root@host "mysql database -e 'query to run on table_name; more queries to run;'"

如果该用户具有执行SQL查询的权限,甚至启动mysql的权限,就可以使用user@host来完成相同的操作。 使用-e--execute相同,它将运行您放在尾随引号(单引号或双引号)中的任何内容,并退出。 标准输出格式与您使用--batch看到的格式相同。


4
良好的问题描述和所需引用。 - mmv-ru

6

MySql似乎有一种特殊的命令行语法,其中包括数据库。

mysql -u 用户名 -p -e 'SQL查询语句' 数据库名称

这份文档可能有些旧,但我已经让它正常工作了。

http://www.cyberciti.biz/faq/run-sql-query-directly-on-the-command-line/

最终可用的ssh命令:

ssh 用户名@主机名 "mysql -u 用户名 -e 'show tables;' 数据库名称"


1
谢谢!其他的回答对我不起作用,但你的却可以。个人而言,我更喜欢在“-e查询”之前使用“-D数据库名称”,因为它更明确——但两种方法都对我起作用。非常感谢你的帮助! - Myke Carter

3

这段代码最终在我的Bash脚本中运行成功:

query='USE [database]; SELECT ...'   
mysql='mysql -u [username] -p[password] -e '"'""$query""'"
ssh [username]@[server] -t "$mysql"

如果你想让它更安全,那么请添加提示输入密码,不要将密码存储在可能不安全的地方。


嗨@OZZIE,输出中有像+和-这样的特殊字符 +--------------------+ | 数据库 | +--------------------+ | information_schema | +--------------------+ 如何在查询中去掉它们? - Swapnil Gangrade

3

在经过几次测试后,这对我有用(基本上与@King-Wzrd的答案相同):

ssh -t kom "mysql -uroot -p -e 'show databases;'"
ssh -t kom "mysql -uroot -p < /home/ling/websites/jin_test/.deploy/tmp.sql"

"trick" 是命令周围的引号。
"-t" 选项允许通过远程 shell 交互式提示密码。
这里的 "kom" 只是我在我的 "~/.ssh/config" 文件中定义的 ssh 配置标识符(更多信息请参见:https://www.cyberciti.biz/faq/create-ssh-config-file-on-linux-unix/)。

1

在我的主机环境中运行此操作,连接到Homestead虚拟机中的MySQL数据库后,获得了不错的结果......不过我需要先在虚拟机内设置root密码才能让它正常工作。

ssh vagrant@192.168.10.10 mysql -h localhost -u root -p -e "'SELECT * FROM user;' mysql";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接