昔日埋雷不經意,今朝踩雷排查難:JetBrains系列IDE使用SFTP連線遠端伺服器報“EOF while reading packet”解決方法

同勉共進發表於2022-01-30

寫在前面

這是一篇問題解決記錄。希望能幫到遇到同樣問題的讀者。

強烈建議:請您先看解決步驟一節,如果您發現在下的問題和您的問題不一樣,就可以及時離開本文,避免浪費時間。

正文

問題描述

在使用GoLand連線遠端伺服器時遇到了奇怪的問題:通過ssh連線是 successfully connected! 的,但通過SFTP連線就報 EOF while reading packet 錯誤。跟[1](在下的答案也更新到了這裡)描述的情況一模一樣。

相關環境如下:

  1. GoLand:2021.3
  2. 遠端伺服器:Ubuntu 20.04,非root賬戶(但在下可以登入root)
  3. 本地系統:Win10

解決過程

1. 網上最普遍的說法是更新密碼(因為密碼已過期)或者重啟IDE。但這兩種方法都不奏效。首先,在下的伺服器密碼過期時間是never(讀者可以自行學習如何檢視Linux賬戶的密碼過期時間),並且在下更改了密碼後仍然沒有解決問題。其次,重啟IDE毫無幫助。

2. 在下突發奇想,既然GoLang無法SFPT連線遠端伺服器,那我直接通過命令列連線呢?這樣就能確定是GoLand的問題還是伺服器的問題了。於是,在下開啟PowerShell,鍵入命令 sftp -v -P 22 user_name@IP ,回車,提示輸入密碼,輸入密碼再回車,得到了報錯 debug1: Exit status 127 Connection closed 。

3. 在Google上檢索 linux sftp Connection closed 127 ,於是找到了[2][3][4]。至此,問題解決。

原因分析

1. 在下回想起來,之前在伺服器上解除安裝重灌過openssh,當時一通亂搞,很可能就是那個時候“活沒幹利索”,導致配置檔案中sftp-server的路徑出現了錯誤,雷就此埋下。

2. GoLand的報錯只報了結果而沒有報原因。Connection因為找不到命令(因為路徑沒有配置對,當然找不到了,退出碼127就是“command not found”的意思)而closed了,所以當reading packet時,自然就EOF了。如果死磕“EOF while reading packet”,可能到現在都不能解決問題。

啟發

格局要開啟,思維要發散。當一條路走不通時,靜下心來,想想能不能另闢蹊徑,通過某種方法縮小問題排查範圍或者找到問題本質。

解決步驟

  1. 在伺服器上 whereis sftp-server ,找到sftp-server的路徑,比如 /usr/libexec/sftp-server 。
  2. 開啟ssh_config(多半位於 /etc/ssh/sshd_config ),找到 Subsystem sftp 開頭的一句,看後面的內容。如果後面的內容與步驟1找到的路徑不一樣,那您的問題多半就能解決了;反之,本文幫不了您了。
  3. 將路徑改成正確的路徑,如 Subsystem sftp /usr/libexec/sftp-server ,儲存檔案。
  4. 重啟sshd。(類似 /etc/init.d/sshd restart 這樣的命令,同理,sshd的路徑可以通過 whereis sshd 查出來)
  5. 重啟IDE,重新連線,成功。(這一步不能省略)

參考:

[1] ftp - SFTP - "EOF while reading packet" error in PhpStorm, works fine in FileZilla - Stack Overflow
[2] SFTP無法連線,報“Connection closed by server with exitcode 127_weixin_39833509的部落格-CSDN部落格
[3] SFTP error using Cyberduck: EOF while reading packet | DigitalOcean
[4] centos - Can connect via SSH - but not via SFTP? Exit status 127 - Server Fault

寫在後面

希望這篇文章能幫到遇到同樣問題的讀者。由於在下才疏學淺,能力有限,錯誤疏漏之處在所難免,望廣大讀者批評指正,您的批評是在下前進的不竭動力。

相關文章