2014-12-03 176 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