改写的问题:
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
我错过了什么?
您缺less引号和正确的mysql客户端命令行:
ssh -p 8899 root@$REMOTEIP "mysql -u root -p -e \"$SQL\""
您需要绕过$ SQLvariables的引号,以便它们被传递到远程shell,否则它们会被本地shell解释(这就是为什么您没有findDROP:命令,分号由shell解释)。 ,让MySQL客户端执行一个命令,你必须传递-e命令行选项。
你已经把$ VARIABLES放在了引号中(这是很好的做法,并且占用variables/文件名中的空格),但是你在整个行中打开和closures它们 – 这对于BASHvariables赋值工作正常(虽然不推荐),但是当你得到SSH远程命令,它试图执行variables时失败,而不是引用你提供的封闭的string。 正确的SSH命令是:
ssh -p 8899 root @ $ REMOTEIP“mysql -u root -p $ SQL”
因为这个variables已经被引用的引用来引用。
用perl和DBIreplacebash可能会更容易 – 不需要fork mysql,更多的控制权。 另外t'internets上散布着关于“如何”的教程和例子 – 没有任何一点游泳在浪潮中;)