25

jenkins (ci-server) と私の git リポジトリの両方が同じサーバーでホストされています。git リポジトリは 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 コードネーム = Celadon

4

3 に答える 3

48

ワークステーションとサーバーの動作の違いは、ssh各システムで異なるバージョンの OpenSSH クライアント ( ) を使用していることが原因である可能性があります (リモートとローカルではありません)。-Tが指定されていない限り、またはRequestTTY構成オプションが に設定されていない限り、クライアントはサーバーに pty を要求しますno(後者は OpenSSH 5.9 で初めて利用可能になりました)。動作の違いは、この要求がサーバーによって拒否された場合にクライアントがどのように処理するかによって生じます (たとえばno-pty、該当するauthorized_keysエントリで指定されているため)。

  • OpenSSH 5.6 より前:
    • クライアントは「PTY 割り当て要求が失敗しました」というメッセージを表示します。
    • 「no pty」モードで続行
  • OpenSSH 5.6 ~ 5.8 の場合:
    • クライアントは「PTY 割り当て要求が失敗しました」というメッセージを表示します。
    • 接続を中止する
  • OpenSSH 5.9 (およびそれ以降) の場合:
    • クライアントは「PTY 割り当て要求が失敗しました」というメッセージを表示します。
    • が指定されて-tおらず、(デフォルト) である場合 RequestTTYauto
      • 「no pty」モードで続行
    • else (-t指定、またはRequestTTY構成オプションがyesor force)
      • 接続を中止する

pty 割り当て要求が拒否されたときにサーバーsshが異常終了したように見えるため、おそらく OpenSSH 5.6-5.8 を実行しています (少なくともクライアント バイナリの場合)。同様に、ワークステーションsshに警告が表示されても続行するため、5.6 より前の OpenSSH、または 5.9 以降の OpenSSH を実行している可能性があります。でバージョンを確認できますssh -V

-Tクライアント (任意のバージョン) がサーバーから pty を要求しないように、常にオプションを指定することで、動作の違いを防ぐことができます。

ssh -T git@YourServer

実際の G​​it アクセス中、クライアントは pty を割り当てようとしません。これは、Git がssh server git-upload-pack path/to/repository「対話型」セッション (例: ssh server) を要求する代わりに、実行する特定のコマンド (例: ) をクライアントに提供するためです。つまり、no-pty実際の G​​it アクセスで問題が発生することはありませんでした。コマンド引数がないと暗黙の pty 割り当て要求が発生するため (「対話型」セッションの場合)、認証テストにのみ影響します (実行している OpenSSH クライアントのバージョンによって異なります)。


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 デーモン構成ファイルに (コメント化されていない) 行が含まれている場合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 に答える