2014-12-03 137 views
0

我在本地系统上有一个脚本,它调用远程服务器(服务器A)上的脚本来执行。这触发远程服务器脚本在脚本的命令看起来像远程服务器上确保在远程服务器上成功执行脚本

ssh <user>@<server ip> "bash -s < ./shell_backup_trx_db.sh" 

脚本shell_backup_trx_db.sh需要数据库备份并把它放在服务器的文件系统。如何确保使用上述命令的本地脚本能够成功执行ssh命令,并提前继续执行脚本或者中止它?

+0

为什么使用'bash -s <./hell_backup_trx_db.sh'而不是'bash shell_backup_trx_db.sh'?如果你的脚本存在一个失败的返回码,那么我相信ssh也是如此,你可以在本地测试。 – 2014-12-03 17:13:04

+0

感谢@EtanReisner对你的回复不太确定-s参数,我刚刚在通过ssh执行脚本时发现它。此外,如果由于任何原因ssh命令无法连接到远程服务器,在这种情况下ssh会返回somthing? – arpitr 2014-12-03 17:33:44

+1

如果它无法连接,它将返回一个错误,这意味着如果您使用'&&' – 2014-12-03 17:40:06

回答

1

只要远程脚本返回一个合适的退出代码,您就不应该有这样的问题。

只需使用条件控制操作&&与下一个命令继续只在前面的命令退出没有错误:

ssh <user>@<server ip> "/path/to/shell_backup_trx_db.sh" && echo "Done with backup"

编辑:如果要执行基于是否ssh的多个命令命令通过或失败,则可以使用if..else..fi语句。

例子:

if ssh <user>@<server ip> "/path/to/shell_backup_trx_db.sh"; 
then 
    echo "Backup completed successfully"; 
    ./next_script.sh; 
else 
    echo "Backup failed"; 
    exit; 
fi 
1

要退出你的脚本时SSH失败(无论何种原因),您可以使用这样的事情。

if ! ssh ...; then 
    echo ssh failed 
    exit 
fi 
+0

我相信它应该是'if..then..fi',而不是'if..then..done' – 2014-12-03 19:30:05

+0

@ Chirag64绝对正确。上下文切换问题。固定。谢谢。 – 2014-12-03 19:33:00

0

感谢@Chirag和@Etan的宝贵答案,他们的帮助结束了。

if ssh <user>@<server-ip> stat shell_backup_trx_db.sh \> /dev/null 2\>\&1 
    then 
    # Trigger Production Database back for both mysql and mongo. 
    ssh <user>@<server-ip> "bash -s < ./shell_backup_trx_db.sh" 

    echo "Database backup successfully completed." 

    # Prompt user to check manually that database backup is completed successfully. 
    read -p "Ensure database backup process is successfully completed. Login to dev/stg server and run 'ls command'. Press [Enter] key to continue execution." 
    else 
    # Backup script could not be accessed, abort script execution any further. 
    echo "Back up script not found, aborting script execution, Please take backup before." 1>&2 
    exit 1 
    fi 
相关问题