不幸的是,我没有从服务器外部访问MYSQL数据库的权限。但是SSH是可能的。因此,我尝试从bash文件运行一个简单的SQL语句,该文件创建SSH连接,连接到MYSQL DB并运行该SQL语句。
语法非常简单,但是我无法在一个bash文件中结合使用它们,但是在命令行上每个人都在工作
我正在使用的代码片段:
1)建立SSH连接:
$:sshpass -p my_password ssh my_user@my_server
2)连接到MYSQL数据库:
my_server>mysql -h rdbms -u db_user -D db_name -p db_password
3)运行SQL语句
mysql>SELECT * FROM table
...如上所述。在命令行上运行时一切都很好。
但是,当我将它们组合成bash文件时:
#!/usr/bin/
sshpass -p my_password ssh my_user@my_server
mysql -h rdbms -u db_user -D db_name -p db_password
SELECT * FROM table
它在第一行(建立SSH连接)之后立即停止。有什么想法可以将这些结合吗?
最佳答案
要通过ssh在远程服务器上运行命令,您需要在同一命令行中将该命令作为参数列出。
例如:
sshpass -p my_password ssh my_user@my_server date
这将在远程服务器上运行
date
,并返回该命令的输出。您也可以通过这种方式运行mysql客户端。只需将mysql命令作为ssh的参数放在同一命令行上即可。
sshpass -p my_password ssh my_user@my_server mysql ...arguments...
您可以在行尾使用
\
在下一行继续执行长命令。就像您在很长的一行上写了完整命令一样,它的工作原理很简单,但是将其发布到Stack Overflow中比较容易,因此读者不必水平滚动即可阅读它。 :-)还要注意,远程命令必须用引号引起来,因此它看起来像是ssh的单个参数。当它在远程服务器上运行时,它将被扩展为多个参数。
sshpass -p my_password ssh my_user@my_server \
"mysql ...arguments..."
mysql客户端有一个选项
-e
,您可以使用它执行SQL语句。sshpass -p my_password ssh my_user@my_server \
"mysql -h rdbms -u db_user -D db_name -pdb_password -e 'SELECT * FROM table'"
有关密码的一些提示:
-p
和密码之间不能有空格。如果您在-p
后使用空格,则将提示您输入交互密码。除非您将其紧贴-p
,否则空格后面的单词将不会被用作密码。