自動化運維工具---expec

做爲運維常常操做Linux服務器是不可避免的事情的,那麼大家都是怎麼管理的呢?linux

咱們管理的方式較爲複雜了,我說一下:sql

有一套服務器資產管理系統,全部服務器都記錄在上面,包括用戶名密碼,內外網地址都會有記錄。服務器作了禁止ROOT登陸,咱們用公鑰登陸,在服務器上配公鑰和私鑰,而後配置SecureCRT以SSH以公鑰方式登陸服務器。shell

配置操做方法在我之前文章有發過。vim

有的企業使用自動化工具將公鑰分發到全部服務器上,實現免密碼登陸,這樣也是較爲方便的。下面開始進入正題。windows

使用今天的自動化運維腳本也能夠實現,但它的功能可不僅僅是這一個。數組

expect:是一種自動交互式的語言腳本,能夠實現自動交互而無需手動敲yes or no。CentOS 的機器,能夠使用 yum install expect 的方式安裝。bash

expect 腳本實現 SSH 自動登錄服務器

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

如何更方便管理linux服務器,我是這樣作

使用效果如圖:

如何更方便管理linux服務器,我是這樣作

其實作服務器管理上面這些功能就夠了,功能還有不少,有興趣的小夥伴可去探索一塊兒交流撒。

若是有興趣能夠作個集中批量分發ssh祕鑰機子寫個腳本批量分發下去,而後在使用expect腳本更方便管理了。

下面附上SSH無密碼登陸的原理及配置

如何更方便管理linux服務器,我是這樣作

配置主機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腳本批量給服務器上傳(此時已實現免密碼登陸)

  1. #!/bin/bash 
  2.   file=/root/.ssh/id_rsa.pub 
  3.   net=192.168.100 
  4.   ip=$net.$n 
  5.   for n in {1..255};do 
  6.       expect send-rsa-pub.exp $file $ip 
  7.   done     

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"}註釋掉,若是不加,就直接退出。

相關文章
相關標籤/搜索