设为首页 收藏本站
查看: 1079|回复: 0

expect TCL编程解决shell交互问题

[复制链接]

尚未签到

发表于 2018-8-21 08:43:28 | 显示全部楼层 |阅读模式
#!/usr/bin/expect  
#
  
#"设置超时"
  
set timeout 5
  

  

  
#"传递变量"
  
set warname [lindex $argv 0]
  

  

  
#"执行命令给变量赋值"
  
set a [exec sudo rpm -qa gitlab-ce]
  

  

  

  
#"spawn登录到主机"
  
spawn /usr/bin/ssh -p 22 -i /home/ndnnd/test test@172.18.10.160
  

  

  

  
#"匹配交互字段,输入命令或密码"
  
expect "*test':"
  
#send "yes\r"
  
#expect "password:"
  
#"发送命令\r结尾"
  
send "12345\r"
  
expect "*]$"
  

  

  
#"switch用法类似于case"
  
switch $warname {
  "zabbix-2.4.1.tar.gz" {
  send "sudo scp root@172.18.10.236:/root/$warname /home/test\r"
  expect "*password:"
  send "tl0001010\r"
  interact
  }
  "gitlab-ce-8.0.5-ce.0.el6.x86_64.rpm" {
  
                                send "sudo scp root@172.18.10.236:/root/$warname /home/test\r"
  
                                expect "*password:"
  
                                send "tl0001010\r"
  interact
  
                        }
  #"退出"
  "quit" {
  
                                send "exit\r"
  expect eof
  exit
  
                        }
  
}
  
#"执行脚本"
  
#send "sudo /bin/bash /home/test/testssh.sh\r"
  

  

  
#"执行远程命令"
  
send "sudo cat /etc/passwd\r"
  

  
#"if用法"
  
#if { $warname == "zabbix-2.4.1.tar.gz" } {
  
#send "sudo scp root@172.18.10.236:/root/$warname /home/test\r"
  
#expect "*password:"
  
#send "tl0001010\r"
  
#interact
  
#}else {
  
#puts "SYNC error!"
  
#exit 1
  
#}
  

  
#"类似echo用法"
  
puts "--------------------------------------$a---------------------------------------"
  
send "sudo /usr/sbin/nginx -s reload\r"
  
interact
  

  

  
################################################################################
  
expect eof 这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif
  
expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。
  
设置expect永不超时
  
set timeout -1
  
[interact]
  

  
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行
  

  
$argv 参数数组
  

  
expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个....参数
  
################################################################################
  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  
expect语法基础: while、for 循环、if 语句的用法示例
  

  
==两种for循环的写法
  
for {set i 0} {$i$ cat tclfor.test
  
    #!/usr/bin/expect --
  
    #                  http://bbs.chinaunix.net/thread-2301733-1-1.html
  
    # for Bob testing
  
    #
  
    puts "---1---"
  
    for {set i 0} {$i < 10} {incr i} {
  
        puts "I inside first loop: $i"
  
    }
  

  
    puts "---2---"
  
    for {set i 3} {$i < 2} {incr i} {
  
        puts "I inside second loop: $i"
  
    }
  

  
    puts "---3---"
  
    puts "Start"
  
    set i 0
  
    while {$i < 10} {
  
        puts "I inside third loop: $i"
  
        incr i
  
        puts "I after incr: $i"
  
    }
  

  
    set i 0
  
    incr i
  
    puts "---4---"
  
    puts "$i"
  
    # This is equivalent to:
  
    set i [expr {$i + 1}]    #expect里的加减法
  
    puts "---5---"
  
    puts "$i"
  

  
运行:
  

  
===if的写法
  
    if { $sync_flag == "true" } {
  

  
            puts "Sync start at [clock format [clock seconds]]"
  

  
            catch {eval exec ${TOOL_HOME}/bin/${sync_cmd} ${sync_parm} } output
  
            puts $output
  
            if { $output eq "SYNC complete!" } {
  
                    puts "SYNC complete!"
  
            } else {
  
                    puts "SYNC error!"
  
                    exit 1
  
            }
  

  
            puts "Sync end at [clock format [clock seconds]]"
  
    }
  
===ping的例子
  
set p_loop 5
  
while { $p_loop } {
  
    send_user "\nStpe 1 Ping to server..."
  
    set timeout 60
  
    send "ping 10.1.1.1 -c5\r"
  
    expect {
  
        "64 bytes" {
  
            send_user "ok"
  
            set p_loop 0
  
        }
  

  
        timeout {
  
            set p_loop [expr $p_loop-1]  #expect里的加减法
  
            send_user "failed.\n"
  
        }
  
        eof {
  
            send_user "ping 10.1.1.1 -c5 FAIL\n"
  
            exit 1
  
        }
  
}
  
===expect读取文件的例子
  
#!/usr/bin/expect --
  
#            http://scmbob.org/counting_file_lines.html
  
#open a file
  
set fd [open "/home/xiabao/myfile.txt" r]
  
set number 0
  

  
# read each line
  
while { [gets $fd line] >= 0 } { incr number }
  
puts "Number of lines: $number"
  

  
close $fd
  

  
==当前用户是root,我想用 su - oracle,然后在oracle下使用 expect -c 命令,不想用脚本,想用一行命令实现
  
su - oracle -c "expect -c 'spawn sqlplus / as sysdba; expect \"SQL>\"; send \"alter user sys identified by 123456 account unlock;\r\"; send \"exit;\r\"'"



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554489-1-1.html 上篇帖子: shell脚本实现自动配置yum 下篇帖子: Linux基础:Shell脚本学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表