題 如何退出SSH連接?


我通過SSH連接到服務器,使用如下命令將消息發送到套接字服務器:

ssh 181.169.1.2 -p 5566

建立連接並寫入消息並發送後,我無法退出文本模式。我只允許輸入更多文本,就是這樣。

是否有命令或組合鍵允許我返回命令模式?


193
2017-08-28 14:29


起源




答案:


如何退出SSH連接?

兩種方式:

  • 關閉shell會話,例如同 exit 其次是 輸入, 要么 按Ctrl - d 通常允許你退出 ssh 會話通常,
  • 如果您的連接錯誤並且shell沒有響應,請點擊 輸入 鍵,然後鍵入 ~. 和ssh應立即關閉並返回到命令提示符。

第一個選項應該是直觀的,但我們如何知道後一種選擇呢?

我們可以通過仔細閱讀手冊頁來了解這些信息。

$ man ssh

給我們 SSH文檔,其中有關於轉義字符的以下部分:

ESCAPE CHARACTERS
     When a pseudo-terminal has been requested, ssh supports a number of
     functions through the use of an escape character.

     A single tilde character can be sent as ~~ or by following the tilde by
     a character other than those described below.  The escape character
     must always follow a newline to be interpreted as special.  The escape
     character can be changed in configuration files using the EscapeChar
     configuration directive or on the command line by the -e option.

     The supported escapes (assuming the default ‘~’) are:

     ~.      Disconnect.

     ~^Z     Background ssh.

     ~#      List forwarded connections.

     ~&      Background ssh at logout when waiting for forwarded connection
             / X11 sessions to terminate.

     ~?      Display a list of escape characters.

     ~B      Send a BREAK to the remote system (only useful if the peer sup‐
             ports it).

     ~C      Open command line.  Currently this allows the addition of port
             forwardings using the -L, -R and -D options (see above).  It
             also allows the cancellation of existing port-forwardings with
             -KL[bind_address:]port for local, -KR[bind_address:]port for
             remote and -KD[bind_address:]port for dynamic port-forwardings.
             !command allows the user to execute a local command if the
             PermitLocalCommand option is enabled in ssh_config(5).  Basic
             help is available, using the -h option.

     ~R      Request rekeying of the connection (only useful if the peer
             supports it).

     ~V      Decrease the verbosity (LogLevel) when errors are being written
             to stderr.

     ~v      Increase the verbosity (LogLevel) when errors are being written
             to stderr.

78
2017-09-16 21:57



我沒有找到“我們怎麼知道這個”部分特別有幫助,因為對我來說這意味著有某種明顯的尋找解決方案,當我發現它不是特別直觀我會“man ssh” “找到如何斷開連接。例如,我怎麼會找到“退出”?我同意,盡可能重新檢查手冊頁是很好的。 - Alexander Pritchard
@AlexanderPritchard我已經更新了我的答案,以更仔細地解釋我們在這裡做的事情。如果您發現該手冊頁難以理解,請向維護者提出問題,甚至更好,提交一個帶有(不合格的)改進的拉取請求。 - Aaron Hall
這在理論上聽起來不錯,但在實踐中,許多人都在努力弄清楚如何導航這些命令,因為即使知道如何查找所需的信息也假設人們沒有上下文。向維護者提出問題並提交改進的拉取請求甚至超出了這個範圍。我不認為手冊頁是有用的,但如果它們像某些人看起來那樣明確有用,我就不會使用Stack Exchange。我想要清楚我認為你的答案很好,人們應該查看手冊頁,但它們並不是無所不包。 - Alexander Pritchard
“如果它們像某些人看起來一樣明確有用,我就不會使用Stack Exchange。”我同意,這就是為什麼我試著寫出好的答案。引用和引用參考資料並不是要讓任何人感到愚蠢或不好,因為沒有從該資源中讀取,這樣做是為了提供進一步的證據,證明這可能是一個可能是可證明的事實斷言,並告知用戶更多可以存儲相關信息。你想要知道你在語義上做正確的事情,以及知道它是有效的。 - Aaron Hall
請注意,如果 ~ 是您必須鍵入的鍵盤佈局中的死鍵 ~ . - kasperd


簡答:輸入 exit

如果這不起作用,但是......

SSH轉義字符和斷開序列

大多數SSH實現為交互式會話實現轉義字符,類似於telnet Ctrl-] 組合。默認的SSH轉義字符是 ~,在一行的開頭輸入。

如果要終止交互式OpenSSH會話 卡住了,不能通過輸入退出 exit 要么 按Ctrld 進入遠程一側的shell,你可以輸入 ~ 接著是一個點 .。要確保在輸入行的開頭輸入轉義字符,應首先按Enter鍵。 因此,在大多數情況下,以下序列將終止SSH會話:

輸入

其他轉義序列

例如,OpenSSH提供其他轉義序列 ~.。進入 ~? 會議期間應該給你一個清單。一些例子:

  • ~ 其次 Ctrl-Z 暫停會議,
  • ~& 把它直接放到後台,
  • ~# 給出此會話中轉發的連接列表。
  • 如果您只想在一行的開頭輸入代字號,則必須將其加倍: ~~

可以使用命令行選項更改轉義字符 -e。如果設置特殊值 -e none,轉義被禁用,會話完全透明。

也可以看看 ssh上的OpenBSD手冊頁 (引用自 www.openssh.org) 在下面 -e 命令行選項


258
2017-07-17 09:26



為什麼在無用的時候讓它變得簡單? - MariusMatutiae
@MariusMatutiae OP要求一個沒有遠程shell進入的情況 exit 要么 Ctrl-D,但只是一個傾聽過程。我明確表示我的解決方案適合會話 卡住了,無法退出。我試圖澄清這一點,希望現在更容易看到。 - Dubu
我很懷疑,但是 ~. 沒有空格正是我需要的,謝謝! :) - Jamey
在瑞士德語鍵盤佈局中,通過按AltGr + ^(加上它是阻塞鍵)生成波浪號。因此,似乎轉義序列不起作用。有誰知道如何在瑞士德語中鍵入默認轉義? - Daniel Alder
@Dobu找到之前沒有用的原因。如果你已經在同一行輸入〜(如果你正在測試就很容易發生),以下〜。序列被忽略。不得不先按回車... - Daniel Alder


你想退出SSH shell嗎?

你可以輸入 exit 並擊中 輸入,或使用 按Ctrl+d 


33
2017-08-28 18:37



“退出”幫助我,因為ctrl + d在VNC查看器中無效...謝謝 - raj gupta
這在機器凍結或消失或應用程序不響應任何輸入的情況下不起作用 - Daniel Alder


只需輸入 exit 要么 logout (然後按Enter鍵)兩者都可以。


11
2018-04-14 15:00





你可以寫 logout 在控制台行(並點擊 輸入 當然)。


4
2017-07-17 07:12





這些是支持的字符,提供了各種選項,您可以使用它們來使用ssh。

支持的轉義序列:

 ~.  - terminate session

 ~B  - send a BREAK to the remote system

 ~R  - Request rekey (SSH protocol 2 only)

 ~#  - list forwarded connections

 ~?  - this message

 ~~  - send the escape character by typing it twice

(請注意,轉義只能在換行符後立即識別。) 您可以通過點擊關閉Escape序列列表 輸入


4
2018-06-14 22:26





我看到問題得到了充分的回答,但我想補充一點,我看到你通過端口5566上的ssh連接到這個服務器。我讀過一次 這個網站 在非特權端口上通過SSH進行通信(1023以上的所有內容)是不安全的。

當您以非root用戶身份登錄系統時(任何人都不是uid 0),您無法在1024以下創建列出的TCP或UDP端口。這是因為1024以下的端口號是所謂的特權端口,只能是由root或以root身份運行的進程打開。因此,例如,當您的Web服務器(apache,nginx等)啟動時,它將以特權root用戶身份執行此操作,以便打開與端口80(默認情況下將用於HTTP流量的端口)的偵聽連接。現在,只要打開端口並且需要以root身份完成所有操作,Web服務器就會回退到非特權用戶(www-data,apache或nobody用戶)。從那時起,當發生不好的事情時,它僅限於該用戶擁有的權利。現在,回到SSH:當我們在端口22上啟動SSH時,我們知道這是由root或root進程完成的,因為沒有其他用戶可能打開該端口。但是當我們將SSH移動到端口2222時會發生什麼?這個端口可以在沒有特權帳戶的情況下打開,這意味著我可以編寫一個簡單的腳本來偵聽端口2222並模仿SSH以捕獲您的密碼。 

因此,當我自己更改端口時,我總是使用1024以下的端口,這是其他標準軟件尚未使用的端口。有一個很好的清單 維基百科 為了這。

該文章的作者還認為,出於兼容性原因,根本不應該更改SSH端口。

另一個問題是:許多公司都有傳入和傳出防火牆,這意味著您無法訪問任何站點到任何隨機端口並期望它能夠正常工作。一些安全端口(如端口22)通常免除此端口,而端口25或110等其他端口則被阻止。

我個人認為有一些用例可以派上用場。例如,當您或一小部分人是唯一通過SSH連接到服務器的人時,您會記錄自動暴力攻擊並希望保持日誌清潔。


4
2017-07-19 06:59



當然......雖然有很多文字,但我不想發垃圾郵件。 :)但你的論點是好的。 - Ogier Schelvis
根據我的經驗,你在這裡寫的是正確的,但是,是的,每個人都應該考慮這個關於保留端口的事實,不管怎麼說這不是問題。謝謝你的回答! - Andreea
如果有一個不正確的部分,我很好奇它是什麼。 - Ogier Schelvis
我只會給你第一個:你不應該使用低於1024的端口;使用的端口列表從零開始。它被重新設置為使用63737以上的端口。但是你應該考慮這樣一個事實:如果你沒有在服務器上安裝,例如,使用8123端口的Polipo,可以使用它,直到安裝了polipo(和然後沒有人記得改變港口:P) - Andreea
這可能是錯誤的:所描述的問題是執行本地攻擊的人。希望登錄到關鍵基礎設施設備的管理員是可信的。 1024以上的端口比以下多。因此,將服務隱藏在更高端口上可能有助於防止/延遲遠程端口掃描程序看到,這些掃描程序專注於最常用的端口。如果某人正在端口掃描您的更高端口,則IDS可以啟動警報(並且可能部署IPS技術)。限制為<1024會限制您的防御者(受信任的本地管理員)並縮小更可能和不太受信任的攻擊媒介的內容:遠程 - TOOGAM


蘋果系統:當ssh掛起時使用以下順序:

ENTER 
SHIFT+`
.

哪裡: 移位+`  產生  (代字符)


2
2018-03-29 17:25