Solaris 11.4에서 이상한 문제가 발생했습니다.
Perl에서 다음 코드를 실행할 때 문제가 발생합니다.
my $emptystring = "";
syswrite STDOUT, $emptystring;
빈 변수를 사용하여 syswrite 호출을 실행하면 다음이 발생합니다.OpenSSH 세션이 종료되었습니다.:-(
이 문제는 우리에게 새로운 문제로, Solaris 11.3에서 Solaris 11.3으로 마이그레이션한 후에 나타났습니다.솔라리스 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
터미널에서 길이가 0인 메시지를 처리하는 방식을 변경합니다.
문제를 해결하려면 configure
다음 명령의 마지막 줄에 표시된 대로 명령이 C 플래그를 설정해야 합니다.
./configure --with-zlib \
--with-pam \
--with-md5-passwords \
CFLAGS="-DPTY_ZEROREAD=1"