本文參考:《linux就該這么學》
介紹
telnet命令是TELNET協議的用戶接口,它支持兩種模式:命令模式和會話模式,雖然telnet支持許多命令,但大部分情況下,我們只是使用它查看目標主機是否打開了某端口(默認是23)。
工作原理
當你用Telnet登錄進入遠程計算機系統時,你事實上啟動了兩個程序,一個叫Telnet客戶程序,它運行在你的本地機上,另一個叫Telnet服務器程序,它運行在你要登錄的遠程計算機上,本地機上的客戶程序要完成如下功能:
1)建立與服務器的TCP連接。
2)從鍵盤上接收你輸入的字符。
3)把你輸入的字符串變成標准格式並送給遠程服務器。
4)從遠程服務器接收輸出的信息。
5)把該信息顯示在你的屏幕上。
遠程計算機的“服務”程序通常被稱為“精靈”,它平時不聲不響地候在遠程計算機上,一接到你的請求,就馬上活躍起來,並完成如下功能:
1)通知你的計算機,遠程計算機已經准備好了;
2)等候你輸入命令;
3)對你的命令作出反應(如顯示目錄內容,或執行某個程序等);
4)把執行命令的結果送回給你的計算機;
5)重新等候你的命令。
這里做一下簡單的總結,就是客戶機上裝一個telnet的客戶端,服務器上裝一個telnet的監聽程序(精靈),一般這個監聽程序監聽的是23號端口。把這個過程簡單抽象一下,就是客戶端使用telnet工具發送一個命令到服務器端,服務器端監聽到了之后就調用系統相關API來執行這些命令,從而達到了客戶機遠程操作服務器主機的目的。
這里需要注意一點,“把你輸入的字符串變成標准格式並送給遠程服務器”,指的是接受的字符,要按照一定的協議格式傳送到服務器端,而這些字符是通過TCP連接傳輸的,跟Http有點像。Http是通過TCP連接傳輸字符,但是數據格式是HTTP協議規定的格式。簡單來說,所謂的HTTP協議,FTP協議,SMTP協議,就是各自規定了以什么樣的數據包方式在網絡上通過TCP管道傳輸數據。
其實,telnet是以TCP為基礎與服務器進行通信,所以它的功能遠不止遠程登錄服務器(遠程操縱服務器)。不管是什么協議,如果它基於 tcp/ip,那么你使用 TcpClient(或者 Socket)連接它,然后發點信息,依然能連通。Telnet可以看作是一種TCP的連接工具。
執行結果
執行結果有兩種:
端口未打開
telnet 192.168.172.3 80
此時,命令已退出。
端口已打開
telnet 192.168.172.3 80
此時命令未退出。
根據提示Escape character is ']'.可知退出字符為']'(CTRL+])。此時輸入其它字符不能使其退出,CTRL+C都不行。輸入CTRL+]后會自動執行,進入命令模式:
^]
telnet>
此時再運行quit才會真正退出。
其中,Escape character可以自定義,使用參數-e:
telnet -e p 192.168.172.3 80 使用p字符
[root@server1 ~]# telnet -e p 192.168.172.3 80
Telnet escape character is 'p'.
Trying 192.168.172.3...
Connected to 192.168.172.3.
Escape character is 'p'.
p
telnet> quit
Connection closed.
即便如此,退出telnet還是麻煩。那么,更進一步,如果出現在腳本中應該如何(優雅地)退出telnet呢?
方案
輸出結果后立即退出
echo "" | telnet 192.168.172.3 80
[root@server1 ~]# echo "" | telnet 192.168.172.3 80
Trying 192.168.172.3...
Connected to 192.168.172.3.
Escape character is '^]'.
Connection closed by foreign host.
已經成功連接端口並自動退出
[root@server1 ~]# echo "" | telnet 192.168.172.3 80
Trying 192.168.172.3...
telnet: connect to address 192.168.172.3: Connection refused
端口未開放
輸出結果后延遲退出
sleep 2使得telnet輸出結果后,停留2秒后退出命令模式。
sleep 2 | telnet 192.168.172.3 80
使用這種方式可以將標准輸出和標准錯誤重定向到文件中,通過分析文件的內容來判斷端口打開狀態。