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]