做爲運維常常操做Linux服務器是不可避免的事情的,那麼大家都是怎麼管理的呢?linux
咱們管理的方式較爲複雜了,我說一下:sql
有一套服務器資產管理系統,全部服務器都記錄在上面,包括用戶名密碼,內外網地址都會有記錄。服務器作了禁止ROOT登陸,咱們用公鑰登陸,在服務器上配公鑰和私鑰,而後配置SecureCRT以SSH以公鑰方式登陸服務器。shell
配置操做方法在我之前文章有發過。vim
有的企業使用自動化工具將公鑰分發到全部服務器上,實現免密碼登陸,這樣也是較爲方便的。下面開始進入正題。windows
使用今天的自動化運維腳本也能夠實現,但它的功能可不僅僅是這一個。數組
expect:是一種自動交互式的語言腳本,能夠實現自動交互而無需手動敲yes or no。CentOS 的機器,能夠使用 yum install expect 的方式安裝。bash
vim test.exp服務器
#告訴操做系統腳本里的代碼使用那一個shell來執行,使用which expect 便可找到命令所在路徑。運維
#!/usr/bin/expectssh
# 設置超時時間爲 0 秒
set timeout 0
#spawn是進入expect環境後才能夠執行的expect內部命令,若是沒有裝expect或者直接在默認的SHELL下執行是找不到spawn命令的。因此不要用 「which spawn「之類的命令去找spawn命令。比如windows裏的dir就是一個內部命令,這個命令由shell自帶,你沒法找到一個dir.exe 的可執行文件。
spawn ssh root@192.168.0.163
#這裏的expect也是expect的一個內部命令,有點暈吧,expect的shell命令和內部命令是同樣的,但不是一個功能,習慣就行了。這個命令的意思是判斷上次輸出結果裏是否包含「password:」的字符串,若是有則當即返回,不然就等待一段時間後返回,這裏等待時長就是前面設置的30秒
expect "password:"
#這裏就是執行交互動做,send表示發送什麼命令,後面的必定要加表示回車。
send "A0000223456700"
#執行完成後保持交互狀態,把控制權交給控制檯,這個時候就能夠手工操做了。若是沒有這一句登陸完成後會退出,而不是留在遠程終端上。若是你只是登陸過去執行則使用expect eof
interact
這樣一來,把 ali.exp 文件設爲可執行的以後,就能夠 ./test.exp 運行腳本,自動就連上服務器了。
下面分享一個要傳送腳本參數的例子:
#!/usr/bin/expect
# 設置超時時間爲 0 秒
set timeout 0
# 設置要登陸的主機 IP 地址,$argv 參數數組,expect腳本能夠接受從bash傳遞過來的參數.能夠使用[lindex $argv n]得到,n從0開始,分別表示第一個,第二個,第三個....參數
set host "[lindex $argv 0]"
#spawn 一個 ssh 登陸進程
spawn ssh $host
# 等待響應,若是作了免密碼登陸會當即登陸
expect {
"yes/no"
{ send "yes" } ##這裏若是要匹配多個字符串須要自動寫入請繼續往下寫{}的內容
}
interact
# expect eof
使用效果如圖:
其實作服務器管理上面這些功能就夠了,功能還有不少,有興趣的小夥伴可去探索一塊兒交流撒。
若是有興趣能夠作個集中批量分發ssh祕鑰機子寫個腳本批量分發下去,而後在使用expect腳本更方便管理了。
下面附上SSH無密碼登陸的原理及配置
配置主機A免密登陸到主機B
1.在主機A生產密鑰對: ssh-keygen -t rsa, 會在.ssh目錄下產生密鑰文件
2.拷貝主機A的公鑰到主機B: scp id_rsa.pub
3.將主機A的公鑰加到主機B的受權列表.ssh/authorized_keys(若不存在,手動建立): cat id_rsa.pub >> authorized_keys
4.受權列表authorized_keys的權限必須是600,chmod 600 authorized_keys
編寫Expect腳本,實現key的上傳
#!/bin/expect
#
if { $argc != 2 } {
send_user "usage: send-rsa-id file host \n"
exit
}
#define var
set password wbxue.blog
set file [lindex $argv 0 ]
set ip [lindex $argv 1 ]
#start exec command
spawn ssh-copy-id -i $file root@$ip
expect {
"yes/on" {send "yes\r";exp_continue}
"*password*" {send "$password\r"}
}
expect eof
利用bash腳本調用Expect腳本批量給服務器上傳(此時已實現免密碼登陸)
Expect指令說明:
set:能夠設置超時,也能夠設置變量。
timeout:expect超時等待時間,默認10S。
spawn:執行一個命令。
expect"":匹配輸出的內容。
exp_continue:繼續執行下面匹配。
\r:能夠理解爲回車。
$argc:統計位置參數數量。
[lindex$argv 0]:腳本後第一個參數,相似於shell中$1,以此類推。
puts:打印字符串,相似於Shell的echo。
awk-v I="$ip":賦值變量。
expect{...}:輸入多行記錄。
其餘指定說明:
timeout-1:永不超時退出。
log_file/var/log/expect.log:記錄交互信息。
interact:交互後不退出遠程終端,若是加要把expect "root@*" {send "exit\r"}註釋掉,若是不加,就直接退出。