当我尝试通过 ssh 登录远程计算机时,我立即断开连接并显示“写入失败:管道损坏”。我尝试通过 mosh 登录,但 mosh 客户端冻结了。
我尝试过在 Google 上搜索,但能找到的答案都与超时有关(例如,这个Unix堆栈交换问题)。我很确定这不是与超时相关的问题,因为自昨晚(上次工作时)以来我没有进行任何个人配置更改,其他用户也可以正常登录。
运行 ssh -vvv
(非常非常详细的日志)没有发现任何有用的信息。
我已经解决了我的具体问题(请参阅下面的答案),但我想知道哪些其他问题可能会导致该问题(ssh 立即断开连接仅显示“写入失败:管道损坏”)?
我还想知道 sshd/mosh/etc 是否可以报告无法产生会话以帮助诊断问题?
答案1
这里详细介绍了另一种解决方案:https://access.redhat.com/solutions/30316
我开始遇到同样的问题,在调查期间,我让另一个用户尝试以我的用户身份登录。他收到错误,导致我进入上面的链接(无法设置用户 ID:资源暂时不可用)。我确实超出了用户允许的线程限制,增加该限制使我再次登录。
基本上,针对您的用户运行此操作(这是该用户当前活动线程数):
ps -u testuser -L | wc -l
如果结果大于设置的任何限制/etc/security/limits.d/90-nproc.conf(默认值为 1024)对于该用户,您需要增加它。您需要对尚未超过其限制的另一个用户执行此操作(或以某种方式终止一些线程以便能够登录)。
要增加它,只需添加一行与现有行类似但特定于您的用户的行:
testuser soft nproc 2048
我知道这是一个老问题,但这可能会对遇到此问题的人有所帮助。
答案2
因此,在我的具体案例中,我让一个screen
open 运行gdb
连接到一个进程,试图重现客户遇到的与我们的产品产生过多线程相关的问题。显然,这个问题在一夜之间就重现了,我的用户已经达到了系统的用户线程限制。
因此,由于进程和线程限制,sshd 无法在我的用户下生成新进程。最终,我们必须以其他用户身份登录并终止正在运行的screen
、gdb
和正在调试的进程。这释放了进程和线程资源,使我最终能够重新连接。
答案3
如果这对其他人有用,我也遇到了同样的问题,就我的情况而言,结果是我将一个用户添加到了不允许 ssh 访问的 sftp 用户组中。我从该组中删除了该用户,然后,管道不再断开。
答案4
错误可能是用户没有指定登录 shell。检查 /etc/passwd,如果用户有 shell“false”或“nologin”,则登录后无法创建 shell。