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
最近作得稍微複雜一點的,普通用戶卸載軟驅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
--永久卸載floppy流程測試
--腳本中調用得serverip.txt文件內存放目標機器ip地址,每行一個ipspa
進入expect環境後主要使用的內部命令有三個.net
建立一個新進程,並運行給定的程序,它的主要功能是給運行進程加個殼,用來傳遞交互指令,expect能夠經過spawn監聽進程的輸出。rest
此expect非彼expect,它是expect的內部命令,在expect環境中使用,它用來匹配spawn中進程輸出,匹配上了就執行後面的body部分。code
用於執行交互動做,改密碼時能夠send密碼,與手工輸入密碼的動做等效。
expect內部命令會等待目標進程的輸出,等待時間默認10秒,沒有獲得指望值且等待超時後執行下一條命令,也可經過"set timeout number"手動設置時長,「set timeout -1」爲永不超時。
expect eof是在等待結束標誌。由spawn啓動的命令在結束時會產生一個eof標記,expect eof即在等待這個標記.