Linux自動化命令工具expect

expect是Unix系統中用來進行自動化控制和測試的軟件工具,應用在交互式軟件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。html


 

用法

Linux中咱們常常寫腳本處理一些繁瑣的任務,但不幸的是不少交互式的命令咱們不得不人肉響應。bash

expect能夠代替咱們實現與系統的交互。ssh

咱們能夠經過expect實現遠程自動更改用戶密碼,而不須要手動輸入舊密碼和新密碼:ide

#!/bin/bash
usr_passwd='old_passwd'
new_passwd='new_passwd'
while read ip
do
    /usr/bin/expect <<-EOF
set timeout -1
spawn ssh -t mina.xiang@$ip
expect {
"*yes/no*" { send "yes\r";exp_continue }
"*assword:" { send "$usr_passwd\r" }
}
expect "*~]$*" { send "hostname\r" }
expect "*~]$*" { send "passwd\r" }
expect "(current)*password:" { send "$usr_passwd\r" }
expect "New password:" { send "$new_passwd\r" }
expect "Retype*password:" { send "$new_passwd\r" }
expect "*~]$*" { send "exit\r" }
expect eof
EOF
done < /home/mina.xiang/serverip.txt
change-passwd

最近作得稍微複雜一點的,普通用戶卸載軟驅floppy模塊,普通用戶權限不夠時須要經過sudo執行。工具

#!/bin/bash
usr_passwd='passwd'
while read ip
do
    /usr/bin/expect <<-EOF
set timeout -1
spawn ssh -t mina.xiang@$ip
expect {
"*yes/no*" { send "yes\r";exp_continue }
"*assword:" { send "$usr_passwd\r" }
}
expect "*~]$*" { send "hostname\r" }
expect "*~]$*" { send "tty\r" }
expect "*~]$*" { send "pwd\r" }
expect "*~]$*" { send "sudo modprobe -r floppy\r" }
expect "\[sudo\]*mina.xiang:" { send "$usr_passwd\r" }
expect "*~]$*" { send "sudo bash -c \"echo 'blacklist floppy' >> /etc/modprobe.d/blacklist-floppy.conf\"\r" }
expect "*~]$*" { send "sudo bash -c \"echo 'install floppy /bin/false' >> /etc/modprobe.d/blacklist-floppy.conf\"\r" }
expect "*~]$*" { send "sudo cp /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img /boot/initramfs-3.10.0-693.17.1.el7.x86_64.img.$(date +%m-%d-%H%M%S).bak\r" }
expect "*~]$*" { send "sudo dracut --omit-drivers floppy -f\r" }
expect "*~]$*" { send "sudo sed -i '/^GRUB_CMDLINE_LINUX=/s/\"$/ floppy.blacklist=1 rd.driver.blacklist=floppy\"/' /etc/sysconfig/grub\r" }
expect "*~]$*" { send "sudo grub2-mkconfig -o /boot/grub2/grub.cfg\r" }
expect "*~]$*" { send "sudo cp /boot/initramfs-3.10.0-693.17.1.el7.x86_64kdump.img /boot/initramfs-3.10.0-693.17.1.el7.x86_64kdump.img.$(date +%m-%d-%H%M%S).bak\r" }
expect "*~]$*" { send "sudo sed -i '/^KDUMP_COMMANDLINE_APPEND=/s/\"$/ rd.driver.blacklist=floppy\"/' /etc/sysconfig/kdump\r" }
expect "*~]$*" { send "sudo kdumpctl restart\r" }
expect "*~]$*" { send "sudo mkdumprd -f /boot/initramfs-3.10.0-693.17.1.el7.x86_64kdump.img\r" }
expect "*~]$*" { send "exit\r" }
expect eof
EOF
done < /home/mina.xiang/serverip.txt
remove-floppy

--永久卸載floppy流程測試

--腳本中調用得serverip.txt文件內存放目標機器ip地址,每行一個ipspa


 

經常使用指令

進入expect環境後主要使用的內部命令有三個.net

  • spawn

 建立一個新進程,並運行給定的程序,它的主要功能是給運行進程加個殼,用來傳遞交互指令,expect能夠經過spawn監聽進程的輸出。rest

  • expect

 此expect非彼expect,它是expect的內部命令,在expect環境中使用,它用來匹配spawn中進程輸出,匹配上了就執行後面的body部分。code

  • send

 用於執行交互動做,改密碼時能夠send密碼,與手工輸入密碼的動做等效。


expect內部命令會等待目標進程的輸出,等待時間默認10秒,沒有獲得指望值且等待超時後執行下一條命令,也可經過"set timeout number"手動設置時長,「set timeout -1」爲永不超時。

expect eof是在等待結束標誌。由spawn啓動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記.

相關文章
相關標籤/搜索