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

时间:2012-04-26 09:28:29

标签: gitolite

jenkins(ci-server)和我的git存储库都托管在同一台服务器上。 git repo由gitolite控制。如果我从外部访问存储库,例如从我的工作站访问存储库

ssh git@arrakis

PTY allocation request failed on channel 0
hello simou, this is git@arrakis running gitolite3 v3.0-12-ge0ed141 on git 1.7.3.4

 R W    testing
Connection to arrakis closed.

我认为这是好的(除了PTY ...警告)

现在回到服务器,我希望jenkins能够连接到我的git存储库。

jenkins@arrakis:~> ssh git@arrakis
gitolite: PTY allocation request failed on channel 0

以用户git(gitolite用户)登录arrakis:

git@arrakis:~> cat ~git/.ssh/authorized_keys

command="/home/git/gitServer/gitolite/src/gitolite-shell jenkins",no-port-forwarding,no-x11-forwarding,no-agent-forwarding,no-pty ssh-rsa <PUBLIC-KEY> jenkins@arrakis

“no-pty”条目让我怀疑,所以我从authorized_keys中删除了它并再次尝试:

jenkins@arrakis:~> ssh git@arrakis
hello jenkins, this is git@arrakis running gitolite3 v3.0-12-ge0ed141 on git 1.7.3.4

 R W    testing
Connection to arrakis closed.

这解决了我的问题,但我不确定删除“no-pty”的后果。

为什么它只会影响本地访问,因为远程访问似乎根本没有受到影响?


openSUSE 11.4(x86_64) 版本= 11.4 CODENAME = Celadon

3 个答案:

答案 0 :(得分:46)

工作站与服务器之间的行为差​​异可能是由于在每个系统上使用不同版本的OpenSSH客户端(ssh)(非远程与本地)。除非给出-T,否则客户端将从服务器请求pty,或者RequestTTY配置选项设置为no(后者首先在OpenSSH 5.9中可用)。行为的差异产生于客户如何处理服务器拒绝此请求(例如,因为no-pty条目中给出了authorized_keys):

  • 在OpenSSH 5.6之前:
    • 客户端将显示“PTY allocation request failed”消息,
    • 继续以“无pty”模式
  • 在OpenSSH 5.6-5.8中:
    • 客户端将显示“PTY allocation request failed”消息,
    • 中止连接
  • 在OpenSSH 5.9(及更高版本)中:
    • 客户端将显示“PTY allocation request failed”消息,
    • 如果未提供-tRequestTTYauto(默认值),则
      • 继续以“无pty”模式
    • 其他(-t已提供,或RequestTTY配置选项为yesforce
      • 中止连接

由于您的服务器ssh在其pty分配请求被拒绝时似乎中止,因此它可能正在运行OpenSSH 5.6-5.8(至少对于客户端二进制文件)。同样,由于工作站的ssh显示警告,但仍在继续,因此它可能在5.6之前运行OpenSSH,或者运行5.9或更高版本的OpenSSH。您可以使用ssh -V检查您的版本。

您可以使用始终提供-T选项来防止行为上的差异,以便客户端(任何版本)永远不会从服务器请求pty:

ssh -T git@YourServer

在实际的Git访问期间,客户端永远不会尝试分配pty,因为Git会给客户端一个特定的命令来运行(例如ssh server git-upload-pack path/to/repository),而不是请求“交互”会话(例如ssh server )。换句话说,no-pty不应该导致实际的Git访问问题;它只会影响您的身份验证测试(取决于您运行的OpenSSH客户端的版本),因为缺少命令参数会导致隐式的pty分配请求(对于“交互式”会话)。


来自OpenSSH 5.6 release announcement

  
      
  • 当pty分配请求失败时终止通道。修复卡住的客户端   如果服务器拒绝pty分配(bz#1698)
  •   

bz#1698似乎是对report logged in the “Portable OpenSSH” Bugzilla的引用。


OpenSSH clientloop.c rev 1.234的登记信息:

  

在TTY分配失败时改善我们的行为:如果我们在   RequestTTY =自动模式(默认值),然后不要在TTY处理   分配错误是致命的,而只是恢复本地TTY   熟食模式并继续。这在设备上更优雅   从不分配TTY。

     

如果RequestTTY设置为“yes”或“force”,则分配失败   TTY是致命的。

答案 1 :(得分:2)

要知道它仅影响本地访问的原因,您需要像in this article一样调试它。

ssh -vvv git@arrakis

如果您的/etc/ssh/sshd_config SSH守护程序配置文件包含(未注释的)行SyslogFacility AUTHPRIV,您可以查看/var/log/secure中的SSH日志。

话虽如此,请查看GitoliteV3:我认为它不会在当前设置中使用no-pty

答案 2 :(得分:1)

除了克里斯·约翰森之外,非常完整的回答说明明确地给出info命令不会显示PTY警告:

ssh git@arrakis info

在这种情况下,SSH认为这不是交互式会话,也不会请求TTY。