簡體   English   中英

來自bash腳本的SSH中MYSQL中的嵌套SQL語句

[英]Nested SQL Statement within MYSQL within SSH from bash script

我有一個不幸的情況,我沒有從服務器外部訪問 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'"

關於密碼的一些提示:

  1. -p和密碼之間不能有空格。 如果您使用-p並在其后加一個空格,系統會以交互方式提示您輸入密碼。 空格后面的單詞不會被當作密碼,除非你把它貼在-p

  2. 我不喜歡在命令行上以明文形式輸入密碼。 這樣做是不安全的,因為任何可以訪問您的 shell 歷史記錄的人都可以查看密碼。 最好使用選項文件登錄文件 但是您必須將它們放在運行 mysql 客戶端的遠程服務器上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM