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一致。

73人参与, 0条评论 登录后显示评论回复

你需要登录后才能评论 登录/ 注册