我正在尝试在我的shell脚本中运行一个ssh命令,它将在远程服务器上自动创建数据库,用户,密码等:
password=`date +%s|sha256sum|base64|head -c 32`
read -p "Enter staging folder name... e.g. xxxxxxxx: " stagingdirectory
echo $stagingdirectory
read -p "Give the name for the database (this will be used in mysql)" dbname
echo $dbname
read -p "Give the name of the user for the database (this will be used in mysql)" dbuser
echo $dbuser
sqlstatement="mysql -uXXXXXXX -pXXXXXXXX -hXXXXXXXX -e "
sqlstatement+='"CREATE DATABASE IF NOT EXISTS $dbname;CREATE USER $dbuser@'%' IDENTIFIED BY '$password';GRANT ALL PRIVILEGES ON $dbname.* TO $dbuser@'%';FLUSH PRIVILEGES;"'
echo $sqlstatement
ssh -A $domainname@35.163.55.55 -e "$sqlstatement"
当我尝试运行此命令时,出现此错误:
这是返回的内容(我用XXXX替换了实际值):
错误的转义字符' mysql -udbadmin -pXXXXX -hXXXXX -e" CREATE DATABASE IF NOT NOT $ $ dbname; CREATE USER $ dbuser @%IDENTIFIED BY XXXXXX;在$ dbname上授予所有特权。* TO $ dbuser @%; FLUSH PRIVILEGES;"'。
我认为这是由于我的sql语句和字符串转义。
答案 0 :(得分:2)
尝试更改行
ssh -A $domainname@35.163.55.57 -e "$sqlstatement"
到
ssh -A $domainname@35.163.55.57 "$sqlstatement"
从ssh手册中,见下文
-e escape_char
为具有pty的会话设置转义字符(默认值:'〜')。转义字符只能识别 一行的开头。逃亡 字符后跟一个点('。')关闭连接;然后控制-Z暂停连接;然后是自己 发送逃脱字符 - 一次。将字符设置为“none”将禁用任何转义并使会话完全透明。
在您的示例中,ssh没有获得有效的转义字符,您也不需要