標籤:des style blog color 使用 io
有些時候,在面對開發機的時候,不斷的telnet和不斷的command自己的命令確實非常麻煩,需要一些自動化的測試或者自動部署的需求。然而面對telnet很多同學都跟我一樣一開始覺得無法通過管道等傳使用者名稱和密碼給telnet進行自動化執行。但其實很是有解決辦法的,目前解決辦法大致分一共有兩種,一種是用第三方的expect這個命令,它可以互動根據終端返回的資訊可以在你事先設定好的遊戲規則之下進行命令,比如expect "Hello", send "Hello, too",表示當終端返回Hello的時候我就返回Hello,too,不然就用其中的set timeout進行逾時等待。具體的用法同學可以參考相關細節,總之,expect絕對是伺服器管理員的利器,如果你有空,確實可以抽空好好學習一下這個命令。但麻煩的就是它不是系統標配的,需要後期安裝。
第二種方法比較簡單,有些同學可能會跟我一樣,想著相容性方面,比如我這個指令碼有可能會給我團隊的隊友一起使用,難道要求他們都去裝expect嗎?有沒有簡單的辦法可以讓shell來幫我們進行telnet並自動執行一些簡單的命令呢?答案是有的,那就是利用管道,echo,telnet的三者結合,先看以下demo.
#!/bin/bash#==============================================# Author: Ricky.k# Description: Auto telnet and run command#============================================== echo "My own command..." &&(sleep 1; echo "user"; sleep 1; echo "password"; sleep 1; echo "cd /usr/local"; sleep 1; echo "./test.sh"; while [[ true ]]; do sleep 1; done;) | telnet 192.168.1.1
可以看到,在輸入完自己命令之後,可以通過小括弧(用大括弧需要注意左邊第一個括弧和第一個命令有一個空格)將命令包起來,這樣整個的管道就是對其中各個命令的全部起作用,利用echo,將使用者名稱,密碼,以及你要輸入的命令通過管道傳給telnet,即實現了自動化的telnet指令碼命令實現。同時需要注意,在最後一個命令(非sleep)之前,如果直接傳給telnent,你會發現命令根本就沒有執行完或者壓根就沒執行就被你取消連結了,這個時候你需要用while迴圈或者sleep一個比較大的值來讓它有時間進行命令響應,這也是需要考慮的。
telnet自動化並沒有我們想的這麼複雜,用用簡單命令一樣可以實現這些功能,也反應了UNIX經典的設計哲學,通過管道和命令組裝,你就擁有了世界上最好的武器。