簡體   English   中英

如何通過SSH將SIGINT(Ctrl-C)發送到當前遠程進程(不帶-t選項)

[英]How to send SIGINT (Ctrl-C) to current remote process over SSH (without -t option)

我需要在SSH會話中向前台運行的遠程進程發送SIGINT。

SSH會話已經建立,所以我不能使用啟動它的選項(如如何通過SSH將SIGINT發送到遠程進程中所述?

ssh -t user@host

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

如果您使用ssh在遠程系統上沒有PTY的情況下啟動進程,那么據我所知,沒有辦法通過該ssh會話發出遠程進程的信號。

SSH協議有一條消息,用於向遠程進程發送信號 但是,您可能將OpenSSH用於客戶端或服務器或兩者,並且OpenSSH不實現信號消息。 因此OpenSSH客戶端無法發送消息,OpenSSH服務器也不會對其進行操作。

有一個SSH擴展發送“中斷”的消息 由OpenSSH的支持。 在交互式會話中,OpenSSH客戶端具有一個轉義序列 ,您可以鍵入該轉義序列以向服務器發送中斷。 OpenSSH服務器通過向遠程會話的PTY發送中斷來處理中斷消息,而unix PTY通常將中斷視為SIGINT。 但是,休息時間基本上是TTY概念,並且這些都不適用於沒有PTY的遠程會話。

簡短回答:

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

並按CTRL + N停止程序。

很長的解釋:

1.您必須使用stty選項intr來更改服務器或本地中斷字符,以免相互沖突。在上面的命令中,我已將服務器中斷字符更改為CTRL + N. 您可以更改本地中斷字符,並保留服務器的中斷字符而不進行任何更改。

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

3.您必須確保在sshd調用的服務器bash上打開控制字符。 如果不這樣做,您最終可能會在注銷后仍然處於閑置狀態。 stty isig

4.你實際上通過陷阱'/ bin / true'SIGINT用空語句捕獲SIGINT信號。 如果沒有陷阱,您在結束SIGINT信號后將不會有任何標准輸出。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM