Solaris 11.4で奇妙な問題が発生しました。
Perlで次のコードを実行すると問題が発生します。
my $emptystring = "";
syswrite STDOUT, $emptystring;
空の変数を使用してsyswrite呼び出しを実行すると、次のようになります。OpenSSHセッションが終了しました。:-(
この問題は私たちにとって新しい問題であり、Solaris 11.3からSolaris 11.3に移行した後に発生しました。Solaris 11.4およびOpenSSH 8.1(7.9より前のバージョンではこの問題は発生しません。)
このエラーが発生します出力が標準出力の場合のみ。スクリプトの出力がファイルにリダイレクトされると、すべてがうまく機能します。
スクリプトを追跡し、truss
次の呼び出しでエラーが発生した場合:write
23886: write(1, 0x004B6450, 0) = 0
表示された書き込み呼び出しはすべてが正常に機能している間に行われ、エラーが発生するとセッションが終了し、トラス出力が停止し、この行以降の内容はすべて表示されません。
追加情報:私たちはSolaris 11.3用にコンパイルされたバイナリをテストして動作します!したがって、明らかに問題は私たちの編集から来ているようですが、まだ理由はわかりません...続き...
追加情報:la コンパイルに大きな違いはありません。これOpenSSHサーバーログ見せるNULL値はEOFとして扱われます。次の図に示すように、このエラーが発生したOpenSSHと正しく機能する他のOpenSSHの違いを示します。
これを示す行は次のとおりです。
debug2: channel 0: read<=0 rfd 16 len 0
debug2: channel 0: read failed
debug2: channel 0: chan_shutdown_read (i0 o0 sock -1 wfd 16 efd -1 [closed])
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug3: send packet: type 96
debug2: channel 0: input drain -> closed
どんなアイデアがありますか?
ベストアンサー1
解決策を見つけました! :-) 簡単に言えば、私たちはCフラグ設定PTY_ZEROREAD
コンパイルの構成フェーズ中。
channels.c
ソースコードファイルでエラーが発生した場所を確認できます。
#ifndef PTY_ZEROREAD
if (len <= 0) {
#else
if ((!c->isatty && len <= 0) ||
(c->isatty && (len < 0 || (len == 0 && errno != 0)))) {
#endif
debug2("channel %d: read<=0 rfd %d len %zd",
c->self, c->rfd, len);
if (c->type != SSH_CHANNEL_OPEN) {
debug2("channel %d: not open", c->self);
chan_mark_dead(ssh, c);
return -1;
} else {
chan_read_failed(ssh, c);
}
return -1;
}
コンパイルフラグを見ることができますPTY_ZEROREAD
端末が長さゼロのメッセージを処理する方法を変更します。
問題を解決するには、configure
次のコマンドの最後の行に示すように、コマンドはCフラグを設定する必要があります。
./configure --with-zlib \
--with-pam \
--with-md5-passwords \
CFLAGS="-DPTY_ZEROREAD=1"