25

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 代号 = 青瓷

4

3 回答 3

48

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

  • 在 OpenSSH 5.6 之前:
    • 客户端将显示“PTY 分配请求失败”消息,并且
    • 继续“无 pty”模式
  • 在 OpenSSH 5.6-5.8 中:
    • 客户端将显示“PTY 分配请求失败”消息,并且
    • 中止连接
  • 在 OpenSSH 5.9(及更高版本)中:
    • 客户端将显示“PTY 分配请求失败”消息,并且
    • 如果-t没有给出,并且RequestTTYauto(默认),那么
      • 继续“无 pty”模式
    • else(-t给定,或者RequestTTY配置选项是yesor force
      • 中止连接

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

您可以通过使用 always 提供-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 发布公告

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

bz#1698似乎是对记录在“Portable OpenSSH”Bugzilla 中的报告的引用。


OpenSSH clientloop.c rev 1.234的签入消息中:

在 TTY 分配失败时改进我们的行为:如果我们处于 RequestTTY=auto 模式(默认),那么不要将 TTY 分配错误视为致命,而只是将本地 TTY 恢复为熟模式并继续。这在从不分配 TTY 的设备上更加优雅。

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

于 2012-04-27T07:33:21.957 回答
2

要知道为什么它只影响本地访问,您需要像在本文中那样调试它。

ssh -vvv git@arrakis

如果您的/etc/ssh/sshd_configSSH 守护程序配置文件包含 (un-commented) 行SyslogFacility AUTHPRIV,您可以查看您的 SSH 登录/var/log/secure

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

于 2012-04-26T11:09:42.310 回答
1

除了 Chris Johnsen 之外,非常完整的答案请注意,明确给出info命令不会显示 PTY 警告:

ssh git@arrakis info

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

于 2012-08-03T07:34:48.240 回答