不幸的是,我没有从服务器外部访问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,否则空格后面的单词将不会被用作密码。
  • 我不喜欢在命令行上以纯文本形式输入密码。这样做不安全,因为任何可以访问您的Shell历史记录的人都可以查看密码。最好使用option filelogin file。但是您必须将它们放在运行mysql客户端的远程服务器上。
  • 09-04 19:58
    查看更多