如何修复通道0上的请求失败

124
当我想要像这样连接到我的服务器时:
ssh -a username@my-server.de -p 22

它给了我两个错误消息:

PTY allocation request failed on channel 0
shell request failed on channel 0

当我使用参数-T时,第一个错误消息消失了。 但是如何解决第二个错误呢? 我无法连接。我可以轻松连接其他服务器。 我使用的是MAC OS 10.9。 参数-v向我显示了此调试输出:
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: Connecting to xxx.your-server.de [188.40.3.15] port 22.
debug1: Connection established.
debug1: identity file /Users/xxx/.ssh/id_rsa type -1
debug1: identity file /Users/xxx/.ssh/id_rsa-cert type -1
debug1: identity file /Users/xxx/.ssh/id_dsa type -1
debug1: identity file /Users/xxx/.ssh/id_dsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version mod_sftp/0.9.8
debug1: no match: mod_sftp/0.9.8
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA 55:f5:ca:ca:01:45:0f:7b:71:0a:1f:ba:9e:25:17:fb
debug1: Host 'xxx.your-server.de' is known and matches the RSA host key.
debug1: Found key in /Users/xxx/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Trying private key: /Users/xxx/.ssh/id_rsa
debug1: Trying private key: /Users/xxx/.ssh/id_dsa
debug1: Next authentication method: password

输入密码后,我看到了这个:
debug1: Authentication succeeded (password).
Authenticated to xxx.your-server.de ([xxx.xxx.3.15]:22).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = de_DE.UTF-8
shell request failed on channel 0

6
客户端请求一个带有TTY的Shell会话,但服务器拒绝了该请求。服务器没有向客户端提供拒绝该请求的详细原因。你需要在服务器上进行故障排除,而不是在客户端上进行。 - Kenster
谢谢你的回答。你是对的,服务器没有提供这个请求。我不知道如何找出问题出在哪里。我之前读了一些其他帖子,但它们并没有完全匹配我的问题。有人能给我一些提示吗? - user1895268
4
尝试使用ssh [-必要选项] /bin/bash -i命令。这可能会从服务器端提供更详细的错误信息(例如“权限被拒绝”或“分段错误”)。 - Hans Lub
11
“debug1: Remote protocol version 2.0, remote software version mod_sftp/0.9.8”这行代码表明远程服务器是使用proftpd+mod_sftp,而mod_sftp模块不支持执行shell请求,仅支持SFTP/SCP。这就是为什么会出现“shell request failed”的错误提示。 - Castaglia
2
当服务器是Jenkins时,它仅支持有限的命令集,而不是shell。因此,当给出一个被接受的命令如“help”时,它可以正常工作,但如果请求shell,则会响应“shell request failed on channel 0”。 - U.V.
23个回答

35

通道0上的PTY分配请求失败

系统上有256个伪终端的限制,可能您有一个泄漏伪终端的应用程序。请使用

lsof /dev/pts/*

查看有哪些进程打开了伪终端

通道0上的shell请求失败

我遇到了这个错误(没有PTY分配错误)。原来是我的一个应用程序(QtCreator 3.0.?)泄漏了僵尸进程。其他用户能够登录,因此我可能已经达到了每个用户的进程配额(如果有这样的事情)。我已更新为QtCreator 3.3。目前为止一切正常。


如何在Windows上检查我的远程机器是Linux,但我使用GitBash在Windows计算机上使用ssh连接到此远程机器。 如何在Windows上执行此命令。 - Hana90
5
楼主说他们使用的是MacOS。这个解决方案是否适用于MacOS?我在尝试时(MacOS 10.15.5),出现了以下错误信息:“lsof:/ dev / pts / *上的状态错误:没有那个文件或目录”。 - Jeremy
在哪个系统上,客户端还是服务器?从回答中并不清楚。 - Victor Sergienko

32
卸载并挂载/dev/pts对我有用。
umount /dev/pts

mount devpts /dev/pts -t devpts

参考资料:http://www.iitk.ac.in/LDP/LDP/lfs/5.0/html/chapter06/proc.html

这篇文章是关于Linux中的进程管理。进程是计算机系统中正在执行程序的实例。该文档介绍了如何查看和管理进程,包括通过命令行工具查看进程、发送信号以及使用进程ID(PID)进行操作。此外,还提供了一些示例,帮助读者更好地理解进程管理的概念。

当能够通过ssh登录时,“umount”命令将无法工作,因为设备正在使用中。 - Steven the Easily Amused
1
我正在尝试使用命名空间,并希望能够ssh进入在单独的命名空间中运行的chroot监狱。我一直遇到同样的错误,但是mount devpts /dev/pts -t devpts对我很有帮助。 - Phoenix87
1
请添加说明这是在服务器上进行的操作,而不是在客户端。 - somenxavier

16

我在尝试通过ssh连接到我的服务器时遇到了完全相同的错误。正如我所看到的,你正在使用Hetzner提供的服务器,并通过端口22连接:

debug1: 连接到 xxx.your-server.de [188.40.3.15] 端口 22。

Hetzner的官方Wiki/文档表示:

用于服务器/计算机(控制台)的加密远程诊断协议。要使用的SSH端口是222。

因此,您必须通过端口222进行连接:

ssh -p 222 username@my-server.de

1
这与PTY分配错误无关。 - math
与问题完全无关。 - aefxx
这与错误无关,但是相同的错误导致我产生了这个问题,并且将端口更改为222解决了我的错误。所以从某种程度上来说,它是相关的,因为错误信息可能会对您试图建立的连接产生误导。 - makkus

9

通道0上的shell请求失败

这意味着您没有Shell或远程命令访问权限,请在服务器上修复您的用户权限以获得Shell访问权限,或者如果您只想进行隧道传输,请使用-N-T选项。


4
真棒,给个例子就更好了.. :D - David Noreña
或者你可以远程运行一个命令,比如 ssh user@hostname uptime,这样你就不需要使用 shell。 - Sverre
或者,如果您无法将shell或远程命令访问添加到服务器,则可以使用sftp。 - nachbar

8

试试这个:

vi /etc/security/limits.d/20-nproc.conf
*          soft    nproc     4096   # change to 65535 
root       soft    nproc     unlimited

这就是我的情况。我刚在security/limits.conf中设置了一些通常针对用户的值,但不知怎么回事,我的低值现在太低了。显然,50个进程限制已经不够用了。某些东西必须在登录时启动大量进程。Linux变得越来越臃肿了! - deltaray

8

我曾经帮助解决了一个类似的问题,我们的用户仅使用SSH端口转发,因此他不需要访问PTY,并且在.ssh/authorized_keys文件中被禁止:

no-pty ssh-rsa AAA...nUB9 someuser

所以当您尝试登录此用户时,只会显示一条消息

PTY allocation request failed on channel 0

返回了。请检查您用户的authorized_keys文件。


5

只需将以下内容添加到您的/etc/mtab/etc/fstab中,然后重新启动系统即可。

none    /dev/pts    devpts    defaults    0    0

1
这个可行。在Live CD上,你也可以执行以下命令:$ mount -t devpts none /target/dev/pts; chroot /target - Michael Galaxy
如果我使用Git Bash连接到AWS服务器,并遇到了这个问题,那么我应该从Program Files的主Git Bash目录修改这些文件吗? - user1217585
1
有用的提示:你可以在不登录和分配pty的情况下运行命令,例如 ssh root@example.com '/sbin/reboot' - Robert Calhoun
76
这段代码是做什么的?你需要提供解释。 - Tristan
2
我们进行了这个操作(更改fstab和mtab并重新启动),它起作用了...一段时间。显然是重新启动解决了问题,现在我们怀疑远程机器的资源不足。 - Steven the Easily Amused
我认为你不应该编辑 /etc/mtab,请参考这篇文章。 - PatS

5
如果您想测试您的Github SSH密钥,请输入以下命令:ssh -T git@github.com,而不是ssh -t git@github.com。请注意保留HTML标签。

4

我刚刚发现,我的问题所在(供应商Strato):

最后输出“shell request failed on channel 0”。

我必须使用主密码和Web域名作为登录名。(在德国的www.wunschname.de中,“wunschname”是您的网址。)

使用sftp用户名称和相应密码的ssh登录没有成功。(尽管使用这些sftp用户可以进行scp和sftp!)


3

这是一个老问题,但如果有人像我一样来到这里...

这可能是服务器中日期设置错误的结果。如果您正在使用嵌入式系统,则可能是原因... 所以请检查您的日期:

$ date

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接