2014-11-07 3 views
1

쉘 스크립트에서 이상한 문제가 있습니다. POP3 서버에 연결하고 사서함의 메시지 수를 세는 간단한 스크립트를 작성하려고합니다. 서버의 Bash 버전은 3.2.25 (1) -Linux 상자에 있습니다.Bash 스크립트를 사용하여 POP3 서버에 연결할 수 없습니다.

이렇게 수동으로 명령을 입력하면 작동합니다.

$ telnet <pop3 server ip> 110 
Trying <pop3 server ip>... 
Connected to <pop3 server ip>. 
Escape character is '^]'. 
+OK The Microsoft Exchange POP3 service is ready. 
USER sadmin 
+OK 
PASS sadmin 
+OK User successfully logged on. 
STAT 
+OK 1 10320 
quit 
+OK Microsoft Exchange Server 2010 POP3 server signing off. 
Connection closed by foreign host. 

이제 메시지 수를 확인하기 위해 아래 스크립트를 작성했습니다.

#!/bin/bash 
exec 3<> /dev/tcp/<pop3 server ip>/pop3 
read ok line <&3 
echo $ok $line 
echo USER sadmin >&3 
read ok line <&3 
echo aft userid entered:$ok $line 
echo PASS sadmin1 >&3 
echo STAT >&3 
read num num1 <&3 
echo $num $num1 
echo quit >&3 
exit 

이 스크립트를 실행하면 출력이 다음과 같이 보입니다.

$ ./tcp.sh 
+OK The Microsoft Exchange POP3 service is ready. 
aft userid entered:-ERR Connection is closed. 12 
$ 

나는 그것을 읽을 시간이 오래 걸립니다 다음은 "-ERR 연결이 닫혀"등의 메시지와 함께 다시 오는 3가 fd하기 위해 암호를 보낸 후.

내가 여기에없는 것을 알려주시겠습니까?

당신은 아마 CRLF하지 간단한 UNIX 줄 바꿈 필요는 마이크로 소프트 때문에
+0

는 CR + LF 필요를 , LF만이 아닙니다. 일부 서버는 단순한 LF를 허용하고 다른 서버는 허용하지 않습니다. CR을 명시 적으로 추가하는 것이 좋습니다. –

답변

1

, 나는 그것을 테스트 할 방법이 없다 그러나 나는 같은 것을 시도 할 것이다 : 이론 POP3에서

E.g. crlf="$(echo xy | tr xy '\r\n')"

#!/bin/bash 
crlf="$(echo xy | tr xy '\r\n')" 
exec 3<> /dev/tcp/<pop3 server ip>/pop3 
read ok line <&3 
echo $ok $line 
echo -en "USER sadmin$crlf" >&3 
read ok line <&3 
echo aft userid entered:$ok $line 
echo -en "PASS sadmin1$crlf" >&3 
echo -en "STAT$crlf" >&3 
read num num1 <&3 
echo $num $num1 
echo -en "quit$crlf" >&3 
exit 
+0

왜이 마술은'tr'인가? 'cr = '\ r'을 사용할 수 있습니다; echo -e "foo $ cr"'또는 좀 더 명확한'crlf = '\ r \ n'; echo -en "foo $ crlf"''foo '을 얻습니다. –

+0

작동해야하지만 CR LF는 다른 해석을하는 것으로 유명하며 tr은 적절한 문자를 만드는 데 오래 동안 평판이 좋습니다. (여전히 Windows와 같은^M이 아닙니다.) –

+0

문제에 대한 자세한 내용은 다음을 참조하십시오. http://stackoverflow.com/questions/1552749/difference-between-cr-lf-lf-and-cr-line-break- types –