telnet命令是TELNET協議的用戶接口,它支持兩種模式:命令模式和會話模式,雖然telnet支持許多命令,但大部分情況下,我們只是使用它查看目標主機是否打開了某端口(默認是23)。
其執行結果有兩種:
端口未打開
$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
telnet: connect to address 101.199.97.65: Connection refused
此時,命令已退出。
端口已打開
$ telnet 101.199.97.65 62715
Trying 101.199.97.65...
Connected to 101.199.97.65.
Escape character is '^]'.
此時命令未退出。
根據提示Escape character is '^]'.可知退出字符為'^]'(CTRL+])。此時輸入其它字符不能使其退出,CTRL+C都不行。輸入CTRL+]后會自動執行,進入命令模式:
^] telnet>
此時再運行quit才會真正退出。
telnet> quit Connection closed.
其中,Escape character可以自定義,使用參數-e:
$ telnet -e p 101.199.97.65 62715 #使用p字符 Telnet escape character is 'p'. Trying 101.199.97.65... Connected to 101.199.97.65. Escape character is 'p'. p telnet> quit Connection closed.
即便如此,退出telnet還是麻煩。那么,更進一步,如果出現在腳本中應該如何(優雅地)退出telnet呢?
方案
其實可以這樣:
輸出結果后立即退出
$ echo "" | telnet 101.199.97.65 62715 Trying 101.199.97.65... Connected to 101.199.97.65. Escape character is '^]'. Connection closed by foreign host. #已成功連通端口並自動退出
$ echo "" | telnet 101.199.97.65 62715 Trying 101.199.97.65... telnet: connect to address 101.199.97.65: Connection refused #端口未開放
輸出結果后延遲退出
sleep 2使得telnet輸出結果后,停留2秒后退出命令模式。
$ sleep 2 | telnet 101.199.97.65 62715 Trying 101.199.97.65... Connected to 101.199.97.65. Escape character is '^]'. Connection closed by foreign host.
使用這種方式可以將標准輸出和標准錯誤重定向到文件中,通過分析文件的內容來判斷端口打開狀態。
