2017-06-03 206 views
2

我需要向SSH會話中前臺運行的遠程進程發送SIGINT。如何通過SSH將SIGINT(Ctrl-C)發送到當前遠程進程(不帶-t選項)

SSH會話已經建立,所以我不能使用啓動它(如How to send SIGINT to a remote process over SSH?描述)

ssh -t [email protected] 

我知道我可以打開第二個SSH會話和殺死進程或關閉當前的選項ssh會話,但我想避免這種情況,並直接拋出當前會話(如果可能的話)。

+0

簡短的回答是,你不能沒有一個分配的終端(pty/tty),因爲捕獲一個密鑰序列並將其轉換爲信號是終端的工作。如果維護一個套接字會話就是你想要實現的,那麼你可以使用共享會話。多個ssh連接在同一個套接字上發生。如果您對開始共享會話的順序很熟悉,那麼終止主會話會終止次會話。 –

+0

Stack Overflow是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。另請參閱[我在哪裏發佈有關Dev Ops的問題?](http://meta.stackexchange.com/q/134306) – jww

回答

3

如果您使用ssh在遠程系統上啓動沒有PTY的進程,那麼據我所知,無法通過該ssh會話發送遠程進程的信號。

SSH協議有一個message to send a signal to the remote process。但是,您可能將OpenSSH用於客戶端或服務器或兩者,而OpenSSH不會執行信號消息。所以OpenSSH客戶端不能發送消息,並且OpenSSH服務器不會對其執行操作。

有一個SSH extension to send a "break" message其中由OpenSSH支持。在交互式會話中,OpenSSH客戶端有一個escape sequence,您可以鍵入該值以向服務器發送中斷。 OpenSSH服務器通過向遠程會話的PTY發送中斷來處理中斷消息,並且unix PTYs通常會將中斷視爲SIGINT。然而,休息從根本上說是TTY的概念,並且這些都不適用於沒有PTY的遠程會話。

-1

簡短的回答:

ssh -t fs "stty isig intr ^N -echoctl ; trap '/bin/true' SIGINT; sleep 1000; echo f" > foo 

,並停止CTRL + N的計劃。

朗解釋:

上面我已經改變了服務器中斷字符爲Ctrl + N 1.You必須使用stty參數不及物動詞改變你的服務器或本地中斷字符不相other.In命令衝突。您可以更改您的本地中斷字符,並保留服務器的中斷字符而不做任何更改。

2.如果您不希望中斷字符在您的輸出(和任何其他控制字符)中使用stty -echoctl。

3.您必須確保控制字符在由sshd調用的服務器bash上打開。如果你不這樣做,你可能會在註銷後仍然處於懸掛狀態。 stty isig

4.你實際上是通過陷阱'/ bin/true'捕獲SIGINT信號,並用空語句進行SIGINT。如果沒有陷阱,則在SIGINT信號結束後不會有任何標準輸出。

但是沒有-t選項,不能通過信號退出到在終端上運行的進程。

+0

OP特別要求*不要*使用'-t' –

+0

最後的聲明清楚地表明,可以無法實現 – Harini