2008-12-01 85 views
17

在bash腳本中,我通過ssh在遠程機器上執行命令。如果用戶按Ctrl + C打破腳本,它只會停止腳本 - 甚至不是ssh客戶端。此外,即使我殺死SSH客戶端的遠程命令仍在運行...如何讓ssh在中斷ssh本身時終止遠程進程?

如何使bash殺死本地ssh客戶端和Crtl + c上的遠程命令調用?

一個簡單的腳本:當你按下Ctrl + C

#/bin/bash 
ssh -n -x [email protected] 'mysqldump db' -r file.sql 

回答

17

我 - 最終發現這樣一個解決方案:

#/bin/bash 
ssh -t -x [email protected] 'mysqldump db' -r file.sql 

所以 - 我用的不是 '-n' '-t'。 刪除'-n'或使用不同於root的用戶不會有幫助。

+5

我需要-t -t(兩次)才能使其工作。 – gravitation 2013-08-14 00:29:06

1
trap "some_command" SIGINT 

將執行some_command本地。 help trap會告訴你其他的選擇。

關於ssh問題,我對ssh知之甚少。也許你可以撥打ssh -n -x [email protected] 'killall mysqldump'而不是some_command殺死遠程命令?

2

你知道你傳遞給ssh的選項嗎?我猜不是。 -n選項重定向來自/ dev/null的輸入,因此您在遠程主機上運行的進程可能沒有看到來自Ctrl-C的SIGINT。

現在,讓我們來談談的想法是多麼的糟糕允許遠程root登錄:

這是一個非常,非常糟糕的主意。看看HOWTO: set up ssh keys瞭解如何通過ssh安全地管理遠程進程的執行。如果您需要遠程運行某些特權,您可能需要一個解決方案,該解決方案包含一個帶有嵌入式命令的ssh公鑰和一個以sudo作爲根目錄運行的腳本。

2

當你的ssh會話結束時,你的shell會得到一個SIGHUP。 (掛斷信號)。您需要確保它將它發送到從其開始的所有進程。對於bash,請嘗試shopt -s huponexit; your_command。這可能不起作用,因爲手冊頁說huponexit只適用於交互式shell。

我記得遇到這個問題時,用戶在我的羣集上運行作業,以及他們是否必須使用nohup(以獲得您想要的相反行爲),但在bash手冊頁中找不到任何內容子進程默認是否忽略SIGHUP。希望huponexit能夠做到這一點。 (你可以把這個shopt放在你的.bashrc裏,而不是在命令行上,我想)。

你的ssh -t應該可以工作,因爲當連接關閉時,從終端讀取會得到EOF或錯誤,這使大多數程序退出。