bjghzly 发表于 2018-8-21 08:43:28

expect TCL编程解决shell交互问题

#!/usr/bin/expect  
#
  
#"设置超时"
  
set timeout 5
  

  

  
#"传递变量"
  
set warname
  

  

  
#"执行命令给变量赋值"
  
set a
  

  

  

  
#"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传递过来的参数.可以使用获得,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     #expect里的加减法
  
    puts "---5---"
  
    puts "$i"
  

  
运行:
  

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

  
            puts "Sync start at ]"
  

  
            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 ]"
  
    }
  
===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 #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
  
set number 0
  

  
# read each line
  
while { >= 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]
查看完整版本: expect TCL编程解决shell交互问题