【问题标题】:How to pass variables to SSH command in bash script如何在 bash 脚本中将变量传递给 SSH 命令
【发布时间】:2012-10-21 23:35:13
【问题描述】:

我是 bash 脚本的新手,正在尝试编写一个脚本来将我的本地 Wordpress 数据库与远程数据库同步。这里是:

#!/bin/sh 

RUSER=example-admin 
RHOST=ftp.example.com 
RDBUSER=wp_admin
RDB=wp_db
RDBHOST=localhost
RBAK=.backup/latest-remote-db.mssql 

LUSER=root
LPASS=root
LHOST=localhost
LDB=wp_db
LBAK=.backup/latest-local-db.mssql 

#dump the contents of my local database
mysqldump -u$LUSER -p$LPASS -h $LHOST $LDB > $LBAK

#upload my local database to remote
scp $LBAK $RUSER@$RHOST:~/.backup/

#login to remote host, backup remote database, delete the remote database then recreate it, restore it with the contents of my local database
ssh $RUSER@$RHOST 'mysqldump -uwp_admin -h localhost wp_db > ~/.backup/latest-remote-db.mssql; mysql -uwp_admin -h localhost -Bse "show databases; drop database wp_db; create database wp_db;"; mysql -uwp_admin -h localhost wp_db < ~/.backup/latest-local-db.mssql;'

以上工作正常,但我对最终的ssh 命令不满意,因为所有值都是硬编码的。我更喜欢使用这样的东西:

ssh $RUSER@$RHOST 'mysqldump -u$RDBUSER -h $RDBHOST $RDB > ~/$RBAK; mysql -u$RDBUSER -h $RDBHOST -Bse "drop database $RDB; create database $RDB;"; mysql -u$RDBUSER -h $RDBHOST $RDB < ~/$LBAK;'

但这显然不起作用,因为所有变量都被困在引号内,因此不会被替换。任何人都可以提出更好的方法来实现这一目标吗?我考虑在远程端执行一个单独的脚本来处理所有的mysql 命令,但这让我觉得效率更低。

【问题讨论】:

  • 是否有理由使用单引号 ' 括号,它不会扩展 bash 变量,而不是双引号 "?差异详情:stackoverflow.com/questions/6697753/…
  • bbaja42,这就是答案!非常感谢您的帮助。
  • 下一步你应该接受dogbane的解决方案。

标签: mysql wordpress bash unix ssh


【解决方案1】:

对最外层的引号使用双引号,以便展开变量。在里面使用单引号。

试试这个:

ssh $RUSER@$RHOST "mysqldump -u$RDBUSER -h $RDBHOST $RDB > ~/$RBAK; mysql -u$RDBUSER -h $RDBHOST -Bse 'drop database $RDB; create database $RDB;'; mysql -u$RDBUSER -h $RDBHOST $RDB < ~/$LBAK;"

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多