Mysql

mysql 創建數據庫和使用者腳本

  • November 3, 2009

問題改寫:

HOMEDIR="ftpuser"
REMOTEIP="1.1.1.1"
MYSQLPASS="password"

Q1="DROP USER "$HOMEDIR"_shop;"
Q2="DROP DATABASE "$HOMEDIR"_shop;"
Q3="CREATE DATABASE IF NOT EXISTS "$HOMEDIR"_shop;"
Q4="GRANT ALL ON "$HOMEDIR"_shop TO '"$HOMEDIR"_shop'@'localhost' IDENTIFIED BY '$MYSQLPASS';"
Q5="GRANT ALL ON "$HOMEDIR"_shop TO '"$HOMEDIR"_shop'@'anotherip' IDENTIFIED BY '$MYSQLPASS';"
# Need to grant permissions from another server as well
Q6="FLUSH PRIVILEGES;"
SQL="${Q1}${Q2}${Q3}${Q4}${Q5}${Q6}"

echo $SQL
echo " "
ssh -p 8899 root@$REMOTEIP "mysql -u root -p "$SQL""

然後我執行:

/root/testing/migratesite.sh

並得到:

bash: DROP: command not found
bash: CREATE: command not found
bash: GRANT: command not found
bash: GRANT: command not found
bash: FLUSH: command not found

我錯過了什麼?

您缺少引號和正確的 mysql 客戶端命令行:

ssh -p 8899 root@$REMOTEIP "mysql -u root -p -e \"$SQL\""

您需要對 $SQL 變數周圍的引號進行轉義,以便將它們傳遞給遠端 shell,否則它們會被本地 shell 解釋(這就是你得到 DROP: command not found,分號由 shell 解釋的原因。)此外,要讓 mysql 客戶端執行命令,您必須傳遞 -e 命令行選項。

您已經將 $VARIABLES 括在引號中(這是一種很好的做法,並且考慮了變數/文件名中的空格)但是您在整行中打開和關閉它們 - 這對於 BASH 變數分配來說可以正常工作(儘管不推薦),但是當您進入 SSH 遠端命令,它嘗試執行變數時失敗,而不是您提供的引號括起來的字元串。正確的 SSH 命令是:

ssh -p 8899 根@ $ REMOTEIP “mysql -u root -p $ SQL”

因為變數已經被引號“引用”以傳遞參數。

引用自:https://serverfault.com/questions/80914