`

解决 OpenSSH - “ Error: Connection closed by server with exitcode 128 ” 错误

阅读更多

昨晚,使用 FileZilla 的 SFTP 连接 Ubuntu Server 10.10 时碰到一个诡异错误:

状态:	正在连接 10.1.13.69...
响应:	fzSftp started
命令:	keyfile "E:\key\Bert_id_rsa.ppk"
命令:	open "tdhadoop@10.1.13.69" 22
状态:	Connected to 10.1.13.69
错误:	Connection closed by server with exitcode 128
错误:	无法连接到服务器
 

而使用 Putty 连接就没有问题,使用相同的 key 文件。这说明问题不是出现公钥密码及主机验证上,即 SSH 连接没有问题。


根据错误提示:Connection closed by server with exitcode 128 。其中 128 表示传入了无效参数,参考自 ”Exit Codes With Special Meanings “。在 OpenSSH FAQ 上没有找到答案,然后在其 FileZilla Forums 上找到一篇相关文章 ”Connection closed by server with exitcode 128 “。该文章提示使用”调试“模式运行,以便输出更多有价值错误信息。于是根据 “Logging in FileZilla ” 提示设置 Filezilla Client,日志输出如下:

 

状态:	正在连接 10.1.13.69...
追踪:	Going to execute "F:\FileZilla FTP Client\fzsftp.exe"
响应:	fzSftp started
追踪:	CSftpControlSocket::ConnectParseResponse(fzSftp started)
追踪:	CSftpControlSocket::SendNextCommand()
追踪:	CSftpControlSocket::ConnectSend()
命令:	keyfile "E:\key\Bert_id_rsa.ppk"
追踪:	CSftpControlSocket::ConnectParseResponse()
追踪:	CSftpControlSocket::SendNextCommand()
追踪:	CSftpControlSocket::ConnectSend()
命令:	open "tdhadoop@10.1.13.69" 22
追踪:	Looking up host "10.1.13.69"
追踪:	Connecting to 10.1.13.69 port 22
追踪:	Server version: SSH-2.0-OpenSSH_5.5p1 Debian-4ubuntu4
追踪:	Using SSH protocol version 2
追踪:	We claim version: SSH-2.0-PuTTY_Local:_May_22_2011_19:21:03
追踪:	Doing Diffie-Hellman group exchange
追踪:	Doing Diffie-Hellman key exchange with hash SHA-256
追踪:	Host key fingerprint is:
追踪:	ssh-rsa 2048 6c:df:ef:0b:98:1b:7f:cb:77:23:3d:c0:ac:29:9d:fd
追踪:	Initialised AES-256 SDCTR client->server encryption
追踪:	Initialised HMAC-SHA1 client->server MAC algorithm
追踪:	Initialised AES-256 SDCTR server->client encryption
追踪:	Initialised HMAC-SHA1 server->client MAC algorithm
追踪:	Pageant is running. Requesting keys.
追踪:	Pageant has 1 SSH-2 keys
追踪:	Successfully loaded 1 key pair from file
追踪:	Trying Pageant key #0
追踪:	Key matched loaded keyfile, remove duplicate
追踪:	Sending Pageant's response
追踪:	Access granted
追踪:	Opened channel for session
追踪:	Started a shell/command
状态:	Connected to 10.1.13.69
追踪:	Server exited on signal "PIPE"
错误:	Connection closed by server with exitcode 128
追踪:	CControlSocket::DoClose(64)
追踪:	CSftpControlSocket::ResetOperation(66)
追踪:	CControlSocket::ResetOperation(66)
错误:	无法连接到服务器
 

上面日志信息的关键部分:

追踪:    Server exited on signal "PIPE"
错误:    Connection closed by server with exitcode 128

 

遗憾的是,由于自己对 Linux 系统不太熟悉,还是没有解决问题。只能接着该文继续顺藤摸瓜了。


接下来,查看服务器那边的日志记录,看能否找到些关键线索。通过在 Ubuntu Documentation 上搜索 OpenSSH Server log file 找到 "OpenSSH Configuring ",知道其日志记录文件为 /var/log/auth.log 。该问题的相关日志信息如下:

Jul 24 10:39:22 tdmaster sshd[2096]: Accepted publickey for tdhadoop from 10.1.13.102 port 2740 ssh2
Jul 24 10:39:22 tdmaster sshd[2096]: pam_unix(sshd:session): session opened for user tdhadoop by (uid=0)
Jul 24 10:39:22 tdmaster sshd[2109]: subsystem request for sftp
Jul 24 10:39:22 tdmaster sshd[2096]: pam_unix(sshd:session): session closed for user tdhadoop

 

从权限认证日志中,发现 问题根源是由于子系统请求 sftp 请求导致 session 关闭。 同时,上述日志信息也验证了先前的推断:publickey 确实是正确的。再在 Google 通过上面的错误信息:“ subsystem request for sftp session closed ” 搜索,找到” Debian User Forums - OpenSSH SFTP cannot connect “,同时通过查看 Ubuntu 的启动配置脚本文件 $HOME/.bashrc 也证明 Ubuntu Server 是基于 Debian 系统实现的。 这样, 经过大约 2.5 个小时的奋斗终于把问题给解决了。 (解决问题的时间还是太长了,不是很满意,希望以后有更大的提高。该时间很大程度上取决于找资料的时间:如果我能在最短时间内找到最有用的资料,时间自然而然地缩短了。 这也反映了我的搜索能力还差远了,需要提高很多)解决方法如下:

 

# 注意:SSH 还允许客户端传递系统 Locale 相关的环境变量给服务器
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*

# 将
# Subsystem sftp /usr/lib/openssh/sftp-server
# 替换为
Subsystem sftp internal-sftp

 

但我觉得这种解决方案不是很好,修改该配置信息可能会导致系统服务器那边不能使用 sftp 传输功能(经验证,修改前后的 sftp 功能都运行正常。参考自 sftp - OpenSSH Manualsftp manual )。况且,其它服务器的同样设置都 OK。所以,我断定根源不是由此引起的。通过观察发现,每次登录这台服务器都会输出下面信息,而其它服务器则不会:

-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)

 

并且从 sshd_config 配置文件可知,SSH 会接受 LC_* 环境变量,见上文。这让我猜测问题的 真正 根源 可能是 LC_ALL 设置不正确而引起的 。通过在 Ubuntu Documentation 上搜索 locale LC_ALL 找到“Environment Variables - Locale setting variables ”、“Locale - Ubuntu Documentation ”。如果设置了 LC_ALL 环境变量,它会覆盖所有 LC_* 的环境变量值。/etc/default/locale 文件内容如下:

 

LANG="en_US.UTF-8"
LC_ALL="en_US.UTF-8"  # 引起该问题的根源
LANGUAGE="en_US:en"

 

而其它服务器的 locale 文件则没有设置 LC_ALL 。

接下来就是去掉该行,重启 ssh 服务。退出重新登录后,上面的 -bash 警告信息也没了。 教训:以后得注意了,警告也可能引起一些很难解决的问题,并且这些问题很难追踪。 再通过 FileZilla Client ,看能否访问该服务器?Ok,问题终于完美解决了。 这也验证了我上述的猜测。


重点参考资料

  1. FileZilla Forums - Connection closed by server with exitcode 128
  2. Debian User Forums - OpenSSH SFTP cannot connect
  3. Wiki - SSH File Transfer Protocol

 

分享到:
评论

相关推荐

    python入门-30.寻找列表中只出现一次的数字-寻找单身狗.py

    python入门-30.寻找列表中只出现一次的数字——寻找单身狗.py

    布尔教育linux优化笔记

    linux优化笔记,配套视频:https://www.bilibili.com/list/474327672?sid=4496133&spm_id_from=333.999.0.0&desc=1

    知识付费系统-直播+讲师入驻+课程售卖+商城系统-v2.1.9版本搭建以及资源分享下载

    知识付费系统-直播+讲师入驻+课程售卖+商城系统-v2.1.9版本搭建以及资源分享下载,CRMEB知识付费分销与直播营销系统是由西安众邦科技自主开发的一款在线教育平台,该系统不仅拥有独立的知识产权,还采用了先进的ThinkPhp5.0框架和Vue前端技术栈,集成了在线直播教学及课程分销等多种功能,旨在为用户提供全方位的学习体验,默认解压密码youyacaocom

    美妆神域-JAVA-基于springBoot美妆神域设计与实现

    美妆神域-JAVA-基于springBoot美妆神域设计与实现

    原生js制作Google粘土logo动画涂鸦代码.zip

    原生js制作Google粘土logo动画涂鸦代码.zip

    golin 扫描工具使用, 检查系统漏洞、web程序漏洞

    golin 扫描工具使用, 检查系统漏洞、web程序漏洞

    原生态纯js图片网格鼠标悬停放大显示特效代码下载.zip

    原生态纯js图片网格鼠标悬停放大显示特效代码下载.zip

    用AWLUM进行灰色编码2^2n-QAM调制的精确率Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    去水印web端独立版web

    去水印web端独立版web

    原生js制作左侧浮动可折叠在线客服代码.zip

    原生js制作左侧浮动可折叠在线客服代码.zip

    Chrome 谷歌浏览器下载

    Chrome 谷歌浏览器下载

    亲测全新完整版H5商城系统源码 附教程

    全新完整版H5商城系统源码 自己花钱买的,亲测可用,需要自行下载 H5商城系统设置是实现商城基本功能的核心部分,涵盖了从网站配置、短信和支付配置,到商品、工单、订单、分站和提现管理等多个模块的设置。以下是详细的设置指南,帮助您快速上手并高效管理商城系统。 测试环境:Nginx+PHP7.0+MySQL5.6 1. 网站配置 设置商城名称、LOGO、标题、联系方式和SEO关键词等,确保商城专业和易于搜索。 2. 短信配置 配置短信接口和模板,用于发送订单通知、验证码等,提升用户体验。 3. 支付接口配置 配置微信、支付宝等支付接口,填写API密钥和回调地址,确保支付流畅。 4. 商品分类管理 对商品进行分类和排序,设置分类名称和图标,便于用户查找商品。 5. 商品管理 添加和管理商品信息、规格、图片等,确保商品信息准确丰富。 6. 工单管理 查看和回复用户工单,记录售后问题,提升用户服务质量。 7. 订单管理 查看订单详情,更新订单状态,支持批量导出,方便订单跟踪。 8. 分站管理 创建不同区域分站,设置权限,统一管理各区域市场。 9. 提现管理

    短信3.141592672893982398674234

    apk安装包

    原生js选项卡插件自定义图片滑动选项卡切换.zip

    原生js选项卡插件自定义图片滑动选项卡切换.zip

    1-宗教信息佛教佛寺寺庙庵堂相关数据-社科数据.zip

    宗教信息佛教佛寺寺庙庵堂相关数据集提供了全国各个地区省市县各个佛教寺庙的详细信息。这些数据不仅包括寺庙的名称和负责人姓名,还涵盖了所属省份、地级市、区县、具体地址、建立日期以及支派类别等关键信息。该数据集整理了超过3万条样本,为研究中国佛教寺庙的分布、历史和文化提供了丰富的第一手资料。这些信息有助于了解佛教在中国的传播和发展,以及寺庙在社会和文化中的作用。数据的整理和提供,对于宗教学、社会学、历史学和文化研究等领域的学者来说,是一个宝贵的资源。

    线性电阻网络的等效电阻计算Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    简单的 Python 版本管理.zip

    简单的 Python 版本管理pyenvpyenv 可让您轻松在多个 Python 版本之间切换。它简单、不引人注目,并遵循 UNIX 传统,即使用单一用途的工具来做好一件事。该项目由rbenv和 ruby​​-build分叉而来,并针对 Python 进行了修改。pyenv 的作用是什么......允许您根据每个用户更改全局 Python 版本。为每个项目的 Python 版本提供支持。允许您使用环境变量覆盖 Python 版本。一次搜索多个 Python 版本的命令。这可能有助于使用tox跨 Python 版本进行测试。与 pythonbrew 和 pythonz 相比,pyenv没有……依赖于Python本身。pyenv由纯shell脚本制作。不存在Python的引导问题。需要加载到你的 shell 中。相反,pyenv 的 shim 方法通过向你的 中添加目录来工作PATH。管理虚拟环境。当然,你可以自己创建虚拟环境 ,或者使用pyenv-virtualenv 来自动化该过程。目录安装获取 PyenvLinux/UNIX自动安装程序基本

    Notepad-v2.20工具,是替代Notepad++的首选工具

    Notepad-v2.20工具,是替代Notepad++的首选工具

    原生js随机图片拖拽排序代码.zip

    原生js随机图片拖拽排序代码.zip

    更快、更好、更稳定的Redis桌面(GUI)管理客户端,兼容Windows、Mac、Linux,性能出众,轻松加载海量键值

    更快、更好、更稳定的Redis桌面(GUI)管理客户端,兼容Windows、Mac、Linux,性能出众,轻松加载海量键值

Global site tag (gtag.js) - Google Analytics