交互式轉化批處理工具expect:
基於Tcl語言開發,默認是交互式,但可以免去交互式
借助expect處理交互的命令,可以將交互過程如:ssh登錄,ftp登錄等寫在一個腳本上,使之自動化完成。尤其適用於需要對多台服務器執行相同操作的環境中,可以大大提高系統管理人員的工作效率
注意:
- 在文件中執行時,就必須使用expect自身的程序來運行命令
- 自身的程序是: /bin/expect,可以把expect當成一種語言
命令格式:
expect [選項] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
選項:
-c:從命令行執行expect腳本,默認expect是交互地執行的
-d:可以輸出輸出調試信息
例:
expect "hj" {send "echo hj"} #有hj字符,就打印echo hj
expect "qq" {send "echo qqq"} "ww" {send "echo ww"} #可監聽多個關鍵字
expect {
"qq" {send "echo hj\n"}
"hi" {send "echo hi\n"}
}
expect eof
相關命令:
命令 | 作用 |
---|---|
spawn | 啟動新的進程(運行命令) |
expect | 從進程接收字符串(監聽從程序輸出的關鍵字) |
send | 用於向進程發送字符串 |
interact | 允許用戶交互 |
exp_continue | 繼續,匹配多個字符串在執行動作后加此命令 |
例: 自動登錄ssh腳本
vim exssh
#!/bin/expect
spawn ssh root@2.2.2.25
expect {
"yes/no" {send "yes\n";exp_continue}
"password" {send "123456\n"}
}
expect eof #退出expect程序
chmod +x exssh
./exssh
例2: 設置expect的變量,ssh免交互登錄
vim exssh
#!/bin/expect
set ip 2.2.2.25
set pw 123456
set user root
set timeout 10
spawn ssh $user@$ip
expect {
"yes/no" {send "yes\n";exp_continue}
"password" {send "$pw\n"}
}
例3: 使用位置參數,ssh免交互登陸
vim exssh
#!/bin/expect
set ip [lindex $argv 0] #等於$1
set user [lindex $argv 1] #等於$2
set pd 123456
spawn ssh $user@$ip
expect {
"yes/no" {send "yes\n";exp_continue}
"password" {send "$pw\n"}
}
expect "#" {send "useradd user1\n"}
expect "#" {send "echo 123456|passwd --stdin user1"}
send "exit\n"
expect eof
例4: shell腳本中使用expect腳本
vim ts.sh
#!/bin/bash
IP=1.1.1.25
US=root
expect <<-EOF
set timeout 20
spawn ssh $US@$IP
expect {
"yes/no" {send "yes\n";exp_continue}
"password" {send "$pw\n"}
}
expect "#" {send "touch file111\n"}
send "exit\n"
expect eof
EOF