linux交互执行命令,expect
转载 http://donex.blog.51cto.com/2005970/834467
原文比较乱,只能参考
本地交互执行:1. 修改shell#!/usr/bin/expectset USER [lindex $argv 0]set SHELL [lindex $argv 1]set timeout 3spawn chsh $USERexpect "*]:*" { send "$SHELL\r" }expect eof# ./chsh.sh user1 /bin/tcsh2. 修改密码#!/usr/bin/expectset USER [lindex $argv 0]set PASS "1q2w#E\$R"set timeout 3spawn passwd $USERexpect "*Password:*" { send "$PASS\r" }expect "*Password:*" { send "$PASS\r" }expect eof# ./pass.sh user1或把用户和密码都作为参数#!/usr/bin/expectset USER [lindex $argv 0]set PASS [lindex $argv 1]set timeout 3spawn passwd $USERexpect "*Password:*" { send "$PASS\r" }expect "*Password:*" { send "$PASS\r" }expect eof# ./pass.sh ttt 1q2w#E$R# ./pass.sh ttt "1q2w#E\$R"总结:expect 必须要匹配最后一个输出字符。远程交互ssh 登录:1. 设置变量,执行多命令。#!/usr/bin/expectset IP "10.85.138.42"set timeout 3spawn ssh ${IP}expect "*yes/no*" { send "yes\r" }expect "*assword*" { send "root\r"}expect "*#*" { send "ls\r" }expect "*#*" { send "touch /tanjiyong/newfile\r" }expect eof#./exp.sh2. 增加参数。#!/usr/bin/expectset IP [lindex $argv 0]set USER [lindex $argv 1]set timeout 3spawn ssh $USER@${IP}expect "*yes/no*" { send "yes\r" }expect "*assword*" { send "root\r"}expect "*#*" { send "ls\r" }expect "*#*" { send "touch /tanjiyong/newfile\r" }expect eof#./exp.sh 10.85.138.42 root3. ssh 登录,执行时间超过timeout时间,设定timeout为-1(无限制)。#!/usr/bin/expectset IP [lindex $argv 0]set USER [lindex $argv 1]set IP2 [lindex $argv 2]set timeout 3spawn ssh $USER@${IP}expect "*yes/no*" { send "yes\r" }expect "*assword*" { send "root\r"}expect "*#*" { send "ls\r" }expect "*#*" { send "ping $IP2\r" }set timeout -1expect "*#*" { send "exit 1\r" }expect eof4. ssh 登录,使用循环,在30台机器执行相同命令。#!/usr/bin/expectset USER rootset PASS rootfor {set i 1} {$i<=30} {incr i} {spawn ssh -l $USER 125.1.1.$iexpect "*yes/no*" { send "yes\r" }expect "*assword*" { send "$PASS\r"}expect "*#*" { send "find / -name hao.txt\r" }expect eof}#./exp.sh本地远程交互执行:1. spawn 执行scp#!/usr/bin/expectset PASS rootset timeout 3spawn scp /etc/passwd root@10.85.138.42:/tanjiyongexpect "*yes/no*" { send "yes\r" }expect "*Password:*" { send "$PASS\r" }set timeout -1expect "*#*" { send "exit 1\r" }# ./scp.sh使用-- send#!/usr/bin/expect --set PASS rootset USER rootset IP 10.85.138.42set env(SHELL) /bin/bashset timeout 1spawn $env(SHELL) #spawn /bin/bashexpect "*#*" { send "/usr/bin/scp /etc/passwd $USER@$IP:/tanjiyong\r" }expect "*yes/no*" { send "yes\r" }expect "*Password:*" { send "$PASS\r" }set timeout -1 #复制的时间较长,设置为timeout无限制expect "*#*" { send "exit 1\r" }#!/usr/bin/expectset PASS rootset USER rootset IP 10.85.138.42set env(SHELL) /bin/bashset timeout 1spawn $env(SHELL)expect "*#*" { send -- "/usr/bin/scp /etc/passwd $USER@$IP:/tanjiyong\r" }expect "*yes/no*" { send "yes\r" }expect "*Password:*" { send "$PASS\r" }set timeout -1 #复制的时间较长,设置为timeout无限制expect "*#*" { send "exit 1\r" }#!/usr/bin/expectset timeout 3set env(SHELL) /bin/bashspawn \$env(SHELL)expect -exact "# "send -- "scp $TAR_NAME ${USERNAME}@${DESTIP}{DESTDIR}\r"expect { "*yes/no*" { send "yes\r";exp_continue } "assword: " { send "hw2009\r" }}set timeout -1 #复制的时间较长,设置为timeout无限制expect "# "send "exit\r"expect eof2. expect 搜索块#!/usr/bin/expectset PASS rootset timeout 3spawn scp /etc/passwd root@10.85.138.42:/tanjiyongexpect { "*yes/no*" { send "yes\r";exp_continue } "assword: " { send "$PASS\r" }}set timeout -1expect "*#*" { send "exit 1\r" }# ./scp.sh3. 判断#!/usr/bin/expectset PASS [lindex $argv 0]set USER rootset IP 10.85.138.42set env(SHELL) /bin/bashset timeout 1spawn $env(SHELL)expect "*#*" { send "/usr/bin/scp /etc/passwd $USER@$IP:/tanjiyong\r" }expect { "*yes/no*" { send "yes\r" } "*Password:*" { send "$PASS\r" }}expect "*Password:*" { send_user "\nPasswd error!\n";exit 1 }set timeout -1expect "# " { send "exit 1\r" }expect eof# ./scp.sh4. rsync 备份使用。#!/usr/bin/expect --spawn ssh backup@10.85.138.212expect { "(yes/no)?" { send "yes\r" } "assword" { send "123456\r" }}send "rsync -avz rsync@10.85.138.212:/home/html /opt\r"expect "total size"expect { "rsync error" { exit 1 }}expect "# " send "exit\r"interact#expect eof脚本中使用:#!/bin/bashecho "Start..."cat << EOF > /expectfile#!/usr/bin/expectset PASS rootset USER rootset IP 10.85.138.42set env(SHELL) /bin/bashset timeout 1spawn \$env(SHELL) #必须加上\,不然会被置换为空。expect "*#*" { send "/usr/bin/scp /etc/passwd \$USER@\$IP:/tanjiyong\r" }expect "*yes/no*" { send "yes\r" }expect "*Password:*" { send "\$PASS\r" }set timeout -1expect "# " { send "exit 1\r" }expect eofEOFexpect -f /expectfileecho "$?"echo "finished backup.."附:修改SSH Client为非ask模式vi /etc/ssh/ssh_config# StrictHostKeyChecking askStrictHostKeyChecking no参考:自动登录#!/usr/bin/expectif {$argc!=3} { # 疑问:参数个数($#) send_user "Usage: $argv0 {Array IP} {Password} {CMD}\n\n" exit}set IP [lindex $argv 0]set Password [lindex $argv 1]set CMD [lindex $argv 2]spawn ssh admin@$IPexpect { "assword:" { exec sleep 1 send "${Password}\r" } "*continue connecting*" { exec sleep 1 send "yes\r" expect "*Password:" { exec sleep 1 send "${Password}\r" } }}expect { "*Password*" { send_user "\n1assword error!\n" exit } "*already*" { send_user "\n2:Repeated login!\n" exit } "OceanStor: admin>" { send "${CMD}\r" }}expect "*>" send "exit\r"expect "*closed*"exit脚本2#!/usr/bin/expectset ipaddress [lindex $argv 0]set passwd [lindex $argv 1]spawn ssh -p 22 root@$ipaddressexpect { "want" {send -- "yes\r"; exp_continue} "password:" {send -- "$passwd"} "No route" { exit }}set timeout 5send "\n"expect "*justin*"send "pwd\r"expect "*OK*"send "exit\r"expect eof相关:exit 1/exit #停止执行,退出脚本expect eof #脚本结束expect -exact "# " #精确匹配expect "# "expect "*#*" #模糊匹配exp_continue #在同一个expect块里,做多次匹配。send #发送命令。send_user #打印终端信息。用法与send一致。