Bash를 사용하여 원격 SSHD 서버 버전을 "올바르게" 읽는 방법

Bash를 사용하여 원격 SSHD 서버 버전을 "올바르게" 읽는 방법

추가 도구를 설치하지 않고 bash를 사용하여 원격 SSHD 서버 버전을 읽으려고 합니다.

$ cat < /dev/tcp/x.y.z.t/22
SSH-2.0-OpenSSH_7.2 FreeBSD-20160310
^C

Ctrl+C가 필요하므로 한 줄만 읽으려고 시도했지만 출력에서 ​​이상한 일이 발생했습니다.

$ read version < /dev/tcp/x.y.z.t/22
$ echo "=> version = $version, DONE."
, DONE.ion = SSH-2.0-OpenSSH_7.2 FreeBSD-20160310

\r방금 변수 값 끝에 문자가 있다는 것을 발견했습니다 version.

$ printf "$version" | od -ct x1z
0000000   S   S   H   -   2   .   0   -   O   p   e   n   S   S   H   _
         53  53  48  2d  32  2e  30  2d  4f  70  65  6e  53  53  48  5f  >SSH-2.0-OpenSSH_<
0000020   7   .   2       F   r   e   e   B   S   D   -   2   0   1   6
         37  2e  32  20  46  72  65  65  42  53  44  2d  32  30  31  36  >7.2 FreeBSD-2016<
0000040   0   3   1   0  \r
         30  33  31  30  0d                                              >0310.<
0000045

readbash 내장 기능이 후행 문자를 읽지 못하게 하는 방법은 무엇입니까 \r?

답변1

IFS변수는 (로컬에서!) 수정되어 \r.

function read-ssh-version {
   local IFS=$'\r\n'
   read version < /dev/tcp/"$1"/"$2"
   echo "$version"
}

IFS함수가 작동하고 전역 변수가 수정되지 않았는지 확인하기 위한 몇 가지 최소한의 임시 테스트 :

bash-5.1$ read-ssh-version 127.0.0.1 22 | od -c
0000000    S   S   H   -   2   .   0   -   O   p   e   n   S   S   H   _
0000020    9   .   0  \n
0000024
bash-5.1$ echo -n "$IFS" | od -c
0000000       \t  \n
0000003

(이 \r\n시퀀스는 일반적으로 인터넷 프로토콜에 필수이며 일반적인 Unix 개행 시퀀스와는 다릅니다 \n. 그러나 그것은 다른 질문입니다... 하지만 그것이 바로 그 불쾌한 일이 \r존재하는 이유입니다.)

관련 정보