추가 도구를 설치하지 않고 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
read
bash 내장 기능이 후행 문자를 읽지 못하게 하는 방법은 무엇입니까 \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
존재하는 이유입니다.)